动态绑定 - 根据列解析属性名称

时间:2015-04-17 12:42:22

标签: c# wpf mvvm data-binding

ListView在同一列中有不同的单元格(使用DataTemplateSelector实现)。这是一个非常简单的例子:

<ListView ItemsSource="{Binding Items}">
    <ListView.Resources>
        <l:ResultsSelector x:Key="result1">
            <l:ResultsSelector.TemplateResult>
                <DataTemplate>
                    <TextBlock Text="{Binding Result1}"/> <!-- how to make this dynamic? -->
                </DataTemplate>
            </l:ResultsSelector.TemplateResult>
           ...
       </l:ResultsSelector>
   ...
   </ListView.Resources>
   <ListView.View>
       <GridView>
           <GridViewColumn Header="Result1" CellTemplateSelector="{StaticResource result1}"/>
           <!-- would be nice to use same selector for all columns -->
           <GridViewColumn Header="Result2" CellTemplateSelector="{StaticResource result2}"/>
           <GridViewColumn Header="Result3" CellTemplateSelector="{StaticResource result3}"/>
           ...
       </GridView>
   </ListView.View>
</ListView>

查看模型:

private ObservableCollection<Item> _items;
public ObservableCollection<Item> Items
{
    get { return _items; }
    set
    {
        _items = value;
        OnPropertyChanged();
    }
}

public class Item: NotifyPropertyChangedBase
{
    public string Result1 {get; set;}
    public string Result2 {get; set;}
    public string Result3 {get; set;}
    ...
}

问题ResultSelector对于所有结果列都是相同的(还有其他列),唯一的区别是绑定属性的名称:对于列&#34; Result1&#34 ;它的Result1IsResult1等等,&#34;结果2&#34; - Result2IsResult2

目标:我只想定义一次选择器(如前所述,这是非常简化的版本,因此复制/粘贴&#34; result1&#34;选择器定义{ {1}}次是非常糟糕的选择,特别是如果我必须稍后更改某些内容)并以某种方式将其用于所有列。

问题:有没有办法整理动态绑定。在 dynamic 下,我的意思是根据列动态解析属性名称。

转换? N?想法?

1 个答案:

答案 0 :(得分:0)

会像

public String Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("name"); }
    }

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
有可能吗?这样您至少可以生成字符串并将其作为参数添加到OnPropertyChanged。