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

4

我有一个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 在所有结果列中都相同(还有其他列),唯一的区别是绑定属性的名称: 对于“Result1”列,它是Result1IsResult1等,对于“Result2”列,则为Result2IsResult2等。 目的: 我希望只定义一次选择器(就像我之前说的那样,这是非常简化的版本,所以复制/粘贴“result1”选择器定义N次是非常糟糕的选择,特别是如果以后我需要更改什么)并在某种程度上将其用于所有列。 问题: 有没有一种方法来组织动态绑定。在动态下,我的意思是根据列动态解析属性名称。
转换器?UserControl?有什么想法吗?
1个回答

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中。


我想你误解了我的问题。看看选择器模板中的 TextBlock。它绑定到 Result1,这里没有问题,并且它显示正确的值。问题是如何避免创建另一个选择器(在 xaml 中定义),在那里同样的 TextBlock 将绑定到例如 Result2 - Sinatr
啊,好的,那么它有点与我发布的相反。您需要使用通用 XAML {Binding Result},而不是通用代码。 - Ben
是的,在“Result2”列中显示时,Result值取自Result2属性。 - Sinatr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接