所以基本上我有一个包含另一个对象列表的对象列表。假设我有一个对象列表Class
.类包含Students
列表。每个学生都有一个属性Name
为简单字符串。
所以基本上我想要的是以下内容:用户可以使用组合框选择类。
<ComboBox ItemsSource="{Binding Path=Classes}" DisplayMemberPath="Name" />
这行得通。
从该组合框中选择项目后,用户应看到该类中每个学生的列表(记住Students
中的属性Name
)
为此,我创建了一个简单的项目控件。
<ItemsControl ItemsSource="{Binding Classes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="Name of the Student">
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我的问题是:如何访问标签中的学生姓名?
视图模型应该有一个 SelectedClass
属性,该属性将通过将其绑定到 ComboBox 的 SelectedItem
属性来更新:
<ComboBox ItemsSource="{Binding Classes}"
SelectedItem="{Binding SelectedClass}" .../>
然后,将 ItemsControl 绑定到所选类的Students
集合,如下所示:
<ItemsControl ItemsSource="{Binding SelectedClass.Students}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
请注意,视图模型必须实现 INotifyPropertyChanged 接口,并在SelectedClass
更改时触发 PropertyChanged 事件。
在没有 SelectedClass 视图模型属性的快速而脏的方法中,您还可以直接访问 ComboBox 的 SelectedItem,如下所示:
<ComboBox x:Name="cbClasses" ItemsSource="{Binding Classes}" ... />
<ItemsControl ItemsSource="{Binding SelectedItem.Students, ElementName=cbClasses}">
...