Powderek
Powderek

Reputation: 251

Binding Dictionary<string,List<Class>> to TreeView

I have collection

Dictionary<string, List<Manager>> Stuff;

Manager is class with some properties. I would like to bind this dictionary to TreeView or ListView like this:

Key as title, then list of Managers as children. For example:

I tried something like this:

<TreeView ItemsSource="{Binding Stuff}">
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate>
                            <TextBlock Foreground="Red" Text="{Binding Key}" />
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
</TreeView>

It shows me titles but I don't know how to make it further. Or maybe it will be better to change collection and bind it in some other way.

EDIT

I unnecessarily complicated job with this dictionary. I created a class Stuff with property string Name;, and List<Managers> Managers;.
Use it in main class as ObservableCollection<Stuff> Stuff; and it works fine with this XAML:

<TreeView ItemsSource="{Binding Stuff}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Managers}">
            <TextBlock Foreground="Red" Text="{Binding Name}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

So yeah using Dictionary wasn't best in this case.

Upvotes: 3

Views: 7341

Answers (2)

Amol Bavannavar
Amol Bavannavar

Reputation: 2062

Try this :

<TreeView Name="treeView1" ItemsSource="{Binding Stuff}" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Value}">
            <TextBlock Foreground="Red" Text="{Binding Path=Key}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Upvotes: 3

Sheridan
Sheridan

Reputation: 69959

Try this:

<TreeView ItemsSource="{Binding Stuff}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Values}">
            <TextBlock Foreground="Red" Text="{Binding Key}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

However, I'd always recommend using an ObservableCollection<CustomDataType> as the ItemsSource because it just makes the whole job simpler. For more help with the HierarchicalDataTemplate, please see the HierarchicalDataTemplate Class page on MSDN.

Upvotes: 1

Related Questions