C# (WPF、数据绑定、DependencyProperty)我可以只获取列表中特定成员变量的列表吗?

C# (WPF、数据绑定、DependencyProperty)我可以只获取列表中特定成员变量的列表吗?,c#,wpf,mvvm,data-binding,dependency-properties,C#,Wpf,Mvvm,Data Binding,Dependency Properties,首先,这个问题的主要目的是让其他团队成员更容易在viewmodel中使用我的代码。这是一个为合作设计好代码的问题。因此,使用DependencyProperty,并使用数据绑定 我想做的是,如果用户向MyDependencyProperty列表添加一个值,那么与整个UI相对应的内容将自动应用数据绑定。在本例中,它将是一个组合框。在ItemsSource属性中显示列表,并使用SelectedItem属性选中所选项目 所以我写了下面的代码。但是,在用户定义类型MyData的列表中,我陷入了特定成员(

首先,这个问题的主要目的是让其他团队成员更容易在viewmodel中使用我的代码。这是一个为合作设计好代码的问题。因此,使用DependencyProperty,并使用数据绑定

我想做的是,如果用户向MyDependencyProperty列表添加一个值,那么与整个UI相对应的内容将自动应用数据绑定。在本例中,它将是一个组合框。在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];
    }
}
公共部分类主窗口:窗口
{
公共类MyData
{
公共MyData(int数据1、int数据2、int数据3)
{
数据1=数据1;
数据2=数据2;
数据3=数据3;
}
public int Data1{get;set;}
公共int数据2{get;set;}
公共int数据3{get;set;}
}
公共列表MyDataList
{
get=>(列表)GetValue(MyDataListProperty);
set=>SetValue(MyDataListProperty,value);
}
公共静态只读DependencyProperty MyDataListProperty=DependencyProperty.Register(
“MyDataList”、typeof(列表)、typeof(主窗口)、新UIPropertyMetadata(新列表());
公共MyData CurrentMyData
{
get=>(MyData)GetValue(CurrentMyDataProperty);
set=>SetValue(CurrentMyDataProperty,value);
}
公共静态只读DependencyProperty CurrentMyDataProperty=DependencyProperty.Register(
“CurrentMyData”、typeof(MyData)、typeof(MainWindow)、新UIPropertyMetadata(null);
公共主窗口()
{
初始化组件();
DataContext=this;
添加(新的MyData(1,2,3));
添加(新的MyData(4,5,6));
添加(新的MyData(7,8,9));
CurrentMyData=MyDataList[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>

例如,其目的之一是将MyData的Data3成员的内容显示为组合框列表。如果用户将MyData添加到MyDataList,则会自动添加新的Data3成员值。在上面的实际示例中,整数值3、6和9将显示在组合框的列表中。
<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>