HierarchicalDataTemplate中的固定项

时间:2012-10-19 14:09:10

标签: wpf hierarchicaldatatemplate

我需要在WPF中创建一个看起来像这样的TreeView:

  • 管理员(群组)
    • 用户 (固定节点)
      • Alice Adams (用户)
      • Bob Brown (用户)
    • 权限 (固定节点)
      • 删除(权限)
      • 更新(权限)
  • 嘉宾(群组)
    • 用户 (固定节点)
      • Charlie Clarke (用户)
    • 权限 (固定节点)
      • 查看(权限)

我有一个群组列表,每个群组都有3个属性:

  • 姓名(字符串)
  • 用户(列表)
  • 权限(列表)

只显示用户或权限很简单:

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

但我需要添加2个节点(用户和权限),这些节点会展开以显示2个列表。

任何建议都非常感谢......

1 个答案:

答案 0 :(得分:3)

您可以使用带转换器的MultiBinding来执行以下操作:

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

转换器只会将未经修改的列表归还为IEnumerable<T>