将复杂数据绑定到ItemsControl
问题描述:
所以基本上我有一个包含另一个对象列表的对象列表。可以说我有一个对象列表Class
。并且类包含一个Students
的列表。每个学生都有一个属性Name
作为一个简单的字符串。将复杂数据绑定到ItemsControl
所以基本上我想要的是以下内容: 用户可以使用组合框选择一个类。
<ComboBox ItemsSource="{Binding Path=Classes}" DisplayMemberPath="Name" />
这是行得通的。
从组合框选择一个项目后,用户将看到该类别每个学生的名单(还记得财产Name
在Students
)
我创建用于该目的的简单的ItemsControl。
<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视图模型属性一个快速和肮脏的方法,你也可以直接访问组合框的的SelectedItem是这样的:
<ComboBox x:Name="cbClasses" ItemsSource="{Binding Classes}" ... />
<ItemsControl ItemsSource="{Binding SelectedItem.Students, ElementName=cbClasses}">
...