Question

I need to create a TreeView in WPF that looks something like this:

  • Admins (Group)
    • Users (Fixed Node)
      • Alice Adams (User)
      • Bob Brown (User)
    • Permissions (Fixed Node)
      • Delete (Permission)
      • Update (Permission)
  • Guests (Group)
    • Users (Fixed Node)
      • Charlie Clarke (User)
    • Permissions (Fixed Node)
      • View (Permission)

I have a list of Groups, and each group has 3 properties:

  • Name (string)
  • Users (List)
  • Permissions (List)

Displaying just the Users or Permissions is easy:

        <TreeView ItemsSource="{Binding Groups}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Users}">
                    <TextBlock Text="{Binding GroupName}" />

                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding UserName}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

But I need to add 2 nodes (Users and Permissions) which expand to display the 2 list.

Any suggestions greatly appreciated...

Was it helpful?

Solution

You could use a MultiBinding with a converter to do something like this:

<HierarchicalDataTemplate DataType="{x:Type local:GroupClass}">
        <HierarchicalDataTemplate.ItemsSource>
            <MultiBinding Converter="{StaticResource converter-that-returns-lists-as-is}">
                <Binding Path="Users"/>
                <Binding Path="Permissions"/>
            </MultiBinding>
        </HierarchicalDataTemplate.ItemsSource>
        <TextBlock Text="{Binding Path=Name}"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="IEnumerable[UserClass]" ItemsSource="{Binding Path=.}">
        <TextBlock Text="Users"/>
    </HierarchicalDataTemplate>

    <DataTemplate DataType="{x:Type local:UserClass}">
        <TextBlock Text="{Binding Path=Name}"/>
    </DataTemplate>

    <HierarchicalDataTemplate x:Key="IEnumerable[PermissionClass]" ItemsSource="{Binding Path=.}">
        <TextBlock Text="Permissions"/>
    </HierarchicalDataTemplate>

    <DataTemplate DataType="{x:Type local:PermissionClass}">
        <TextBlock Text="{Binding Path=Name}"/>
    </DataTemplate>

The converter would just give back the lists unmodified as IEnumerable<T>.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top