将复杂数据绑定到 ItemsControl



所以基本上我有一个包含另一个对象列表的对象列表。假设我有一个对象列表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}">
...

最新更新