(WPF, Data Binding, DependencyProperty) 能否只获取列表中特定成员变量的列表?
(WPF, Data Binding, DependencyProperty) Can I get only the list of specific member variables in the list?
首先,这个问题的主要目的是为了方便其他组员在viewmodel中使用我的代码。这是一个良好的合作代码设计问题。所以用到了DependencyProperty,也用到了Data Binding。
我想做的是,如果用户在my DependencyProperty列表中添加一个值,那么整个UI对应的内容会自动应用数据绑定。在示例中,它将是一个 ComboBox。在 ItemsSource 属性 中显示一个列表,并使用 SelectedItem 属性.
检查所选项目
所以我写了如下代码。但是,在用户定义类型MyData的列表中,我卡在了特定成员(MyData中的Data1、Data2、Data3 class)列表到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}"/>
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>
首先,这个问题的主要目的是为了方便其他组员在viewmodel中使用我的代码。这是一个良好的合作代码设计问题。所以用到了DependencyProperty,也用到了Data Binding。
我想做的是,如果用户在my DependencyProperty列表中添加一个值,那么整个UI对应的内容会自动应用数据绑定。在示例中,它将是一个 ComboBox。在 ItemsSource 属性 中显示一个列表,并使用 SelectedItem 属性.
检查所选项目所以我写了如下代码。但是,在用户定义类型MyData的列表中,我卡在了特定成员(MyData中的Data1、Data2、Data3 class)列表到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}"/>
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>