将复杂数据绑定到ItemsControl

时间:2017-10-10 11:50:15

标签: c# wpf user-interface

所以基本上我有一个包含另一个对象列表的对象列表。假设我有一个对象列表Class。而Class包含Students的列表。每个学生都有一个属性Name作为一个简单的字符串。

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

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

有效。

从该ComboBox中选择一个项目后,用户应该会看到该班级中每个学生的列表(请记住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>

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

1 个答案:

答案 0 :(得分: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视图模型属性的快速而肮脏的方法中,您还可以直接访问ComboBox的SelectedItem,如下所示:

<ComboBox x:Name="cbClasses" ItemsSource="{Binding Classes}" ... />

<ItemsControl ItemsSource="{Binding SelectedItem.Students, ElementName=cbClasses}">
...