Home > Enterprise >  create element for each item in nested collection
create element for each item in nested collection

Time:04-24

I have a Dictionary acting as sort of a phonebook. It uses a character from the alphabet as a key, and an observable collection of classes as the value. These classes include properties like FirstName, LastName, etc...

It looks like this

Dictionary<char,ObservableCollection<NameClass>> NameDictionary

The goal is to be able to use this dictionary as an itemsource for a listbox, and insert the key into the listbox, followed by every NameClass.FirstName that is in the observable collection for that specific key.

This is a stripped-down version DataTemplate I currently have

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

This is the ListBox that uses the DataTemplate and NameDictionary as a source.

<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">

The xaml I currently have will insert the key and ObservableCollection into the Listbox, but I want it to insert all of the items inside of the ObservableCollection, not the collection itself.

For a visual example, I want to make something that looks like this

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

But what is currently being inserted is this

Char
ObservableCollection
Char
ObservableCollection
Char
ObservableCollection

I would prefer to use xaml for this, and not code behind. I assume this is not too difficult to do, and I will appreciate any help with this.

CodePudding user response:

Your "HeaderTemplate" does not compile because it lacks a panel which hosts multiple elements. Said that, you can modify it to host another ListBox whose ItemsSource to be bound to Value as follows.

<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>
  • Related