2017-10-10 90 views
0

所以基本上我有一个包含另一个对象列表的对象列表。可以说我有一个对象列表Class。并且类包含一个Students的列表。每个学生都有一个属性Name作为一个简单的字符串。将复杂数据绑定到ItemsControl

所以基本上我想要的是以下内容: 用户可以使用组合框选择一个类。

<ComboBox ItemsSource="{Binding Path=Classes}" DisplayMemberPath="Name" /> 

这是行得通的。

从组合框选择一个项目后,用户将看到该类别每个学生的名单(还记得财产NameStudents

我创建用于该目的的简单的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> 

我的问题是:我如何访问我的标签中的学生姓名?

回答

1

您的视图模型应该有一个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}"> 
...