(WPF, Data Binding, DependencyProperty) 能否只获取列表中特定成员变量的列表?

Posted

技术标签:

【中文标题】(WPF, Data Binding, DependencyProperty) 能否只获取列表中特定成员变量的列表?【英文标题】:(WPF, Data Binding, DependencyProperty) Can I get only the list of specific member variables in the list? 【发布时间】:2020-10-08 14:30:20 【问题描述】:

首先,这个问题的主要目的是为了方便其他团队成员在viewmodel中使用我的代码。这是一个良好的协作代码设计问题。所以用到了DependencyProperty,也用到了Data Binding。

我想要做的是,如果用户在我的 DependencyProperty 列表中添加了一个值,整个 UI 对应的内容就会自动应用数据绑定。在示例中,它将是一个 ComboBox。在 ItemsSource 属性中显示一个列表,并使用 SelectedItem 属性检查所选项目。

所以我写了如下代码。但是,在用户定义类型 MyData 的列表中,我被困在特定成员(MyData 类中的 Data1、Data2、Data3)到 ComboBox 控件的列表的数据绑定中。

从一开始,代码设计就可能是错误的。请教。代码如下。

public partial class MainWindow : Window

    public class MyData
    
        public MyData(int data1, int data2, int data3)
        
            Data1 = data1;
            Data2 = data2;
            Data3 = data3;
        
        public int Data1  get; set; 
        public int Data2  get; set; 
        public int Data3  get; set; 
    

    public List<MyData> MyDataList
    
        get => (List<MyData>)GetValue(MyDataListProperty);
        set => SetValue(MyDataListProperty, value);
    
    public static readonly DependencyProperty MyDataListProperty = DependencyProperty.Register(
        "MyDataList", typeof(List<MyData>), typeof(MainWindow), new UIPropertyMetadata(new List<MyData>()));

    public MyData CurrentMyData
    
        get => (MyData)GetValue(CurrentMyDataProperty);
        set => SetValue(CurrentMyDataProperty, value);
    
    public static readonly DependencyProperty CurrentMyDataProperty = DependencyProperty.Register(
        "CurrentMyData", typeof(MyData), typeof(MainWindow), new UIPropertyMetadata(null));

    public MainWindow()
    
        InitializeComponent();

        DataContext = this;

        MyDataList.Add(new MyData(1, 2, 3));
        MyDataList.Add(new MyData(4, 5, 6));
        MyDataList.Add(new MyData(7, 8, 9));
        CurrentMyData = MyDataList[1];
    

<TextBox  Width="120" Height="23" Margin="76,160,596,236"
    Text="Binding CurrentMyData.Data2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay"/>

<ComboBox  Width="189" Height="34" Margin="291,160,312,225"
    ItemsSource="Binding <!-- list for Data3 -->, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay"
    SelectedItem="Binding <!-- and selected item. CurrentMyData.Data3 ? -->, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay"/>

【问题讨论】:

其中一个目的是,例如,将 MyData 的 Data3 成员的内容显示为 ComboBox 的列表。如果用户将 MyData 添加到 MyDataList,则会自动添加一个新的 Data3 成员值。在上面的实际示例中,整数值 3、6 和 9 将显示在 ComboBox 的列表中。 【参考方案1】:

ItemsSource 可以包含复杂的对象。如果 ComboBox 应该只显示一个属性,请设置 DisplayMemberPath:

<ComboBox 
    ItemsSource="Binding MyDataList"
    SelectedItem="Binding CurrentMyData"
    DisplayMemberPath="Data3"/>

要显示许多属性更改 ItemTemplate:

<ComboBox 
    ItemsSource="Binding MyDataList"
    SelectedItem="Binding CurrentMyData">
    <ComboBox.ItemTemplate>        
        <DataTemplate>            
            <StackPanel>                
                <TextBlock Text="Binding Data1"/>
                <TextBlock Text="Binding Data2"/>
                <TextBlock Text="Binding Data3"/>                
            <StackPanel>            
        </DataTemplate>        
    </ComboBox.ItemTemplate>    
</ComboBox>

【讨论】:

以上是关于(WPF, Data Binding, DependencyProperty) 能否只获取列表中特定成员变量的列表?的主要内容,如果未能解决你的问题,请参考以下文章

[WPF]如何调试Data Binding

WPF中的Data Binding调试指南

WPF QuickStart系列之数据绑定(Data Binding)

WPF中的数据绑定Data Binding使用小结

(WPF, Data Binding, DependencyProperty) 能否只获取列表中特定成员变量的列表?

Wpf学习 数据绑定Binding小达原创