为嵌套集合中的每个项目创建元素

create element for each item in nested collection

我有一个字典作为电话簿。它使用字母表中的一个字符作为键,并使用 类 的可观察集合作为值。这些 类 包括 FirstName、LastName 等属性...

看起来像这样

Dictionary<char,ObservableCollection<NameClass>> NameDictionary

目标是能够将此字典用作列表框的项源,并将键插入列表框,然后是该特定键的可观察集合中的每个 NameClass.FirstName。

这是我目前拥有的精简版 DataTemplate

<DataTemplate x:Key="HeaderTemplate" >
     <TextBlock Text="{Binding Key}"/>
     <TextBlock Text="{Binding Value}"/>
</DataTemplate>

这是使用 DataTemplate 和 NameDictionary 作为源的列表框。

<ListBox x:Name="NameList"  
    Style="{StaticResource ListStyle}" 
    ItemContainerStyle="{StaticResource ContainerStyle}" 
    ItemsPanel="{StaticResource PanelTemplate}" 
    ItemTemplate="{StaticResource HeaderTemplate}"
    ItemsSource="{Binding NameDictionary, IsAsync=True}" 
    SelectedValue="{Binding ItemIndex}" 
    SelectedValuePath="Key">

我目前拥有的 xaml 会将键和 ObservableCollection 插入到列表框中,但我希望它将所有项目插入到 ObservableCollection 中,而不是集合本身。

对于一个视觉示例,我想制作看起来像这样的东西

Char
NameClass.FirstName
NameClass.FirstName
NameClass.FirstName
Char
NameClass.FirstName
NameClass.FirstName
NameClass.FirstName

但是现在插入的是这个

Char
ObservableCollection
Char
ObservableCollection
Char
ObservableCollection

我更愿意为此使用 xaml,而不是代码隐藏。我认为这并不太难,如果有任何帮助,我将不胜感激。

您的“HeaderTemplate”无法编译,因为它缺少承载多个元素的面板。也就是说,您可以修改它以托管另一个 ListBox,其 ItemsSource 将绑定到 Value,如下所示。

<DataTemplate x:Key="HeaderTemplate">
    <StackPanel>
        <TextBlock Text="{Binding Key}"/>
        <ListBox ItemsSource="{Binding Value}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding FirstName}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</DataTemplate>