具有分层数据模板和多种类型的WPF树视图

时间:2014-09-25 15:20:15

标签: c# wpf treeview hierarchicaldatatemplate

我有一个使用HierarchicalDataTemplate创建的树视图,您可以在下面的代码中看到:

  <TreeView ItemsSource="{Binding AllFolders}" SelectedItemChanged="TreeView_SelectedItemChanged"/>

            <HierarchicalDataTemplate DataType="{x:Type model:Folder}" ItemsSource="{Binding Tools}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="{StaticResource ResourceKey=icon}"/>
                    <TextBlock Text="{Binding Title}"/>
                </StackPanel>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type model:Tool}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>

它运行良好但现在我需要在文件夹中添加其他类型的对象以使树视图如下:

  • 文件夹1
  • 文件夹2
    • 工具
      • 工具1
      • 工具2
    • 位置
      • 位置1
      • 位置2
  • 文件夹3

工具和位置必须使用不同的DataTemplate。它们都是IList包含在文件夹类(IList<Tool>IList<Location>)中。

甚至可以这样做吗? 我怎样才能做到这一点?

感谢您的帮助

1 个答案:

答案 0 :(得分:5)

如果您执行以下任一选项,则可以执行此操作:

1)使用类型为ObservableCollection<object>的集合属性,以便您可以在其中添加任何对象类型。

2)定义FolderTool类实现(或扩展)的接口或基类,然后使用类型为ObservableCollection<YourInterface>ObservableCollection<YourBaseClass>的集合属性以便您可以在其中添加任何对象类型。

然后,根据需要定义尽可能多的DataTemplate,但不要在其上设置任何x:Key指令。通过这种方式,当它遇到集合中的不同对象时,它们将全部由Framework明确应用。


更新&gt;&gt;&gt;

再次查看所需的文件夹结构,您似乎只有一种类型作为顶级节点,ToolLocation对象是Folder对象的子对象。如果是这样,那么只要Folder类具有名为FolderFolders的集合属性,就可以使用Locations个对象的集合。

在这种情况下,您只需为这两种类型以及HierarchicalDataTemplate类提供Folder


更新2&gt;&gt;&gt;

您可以定义更多HierarchicalDataTemplate个,一个用于Tool,另一个用于Location类...只要您不提供x:Key指令,它们将由Framework隐式应用:

<HierarchicalDataTemplate DataType="{x:Type model:Tool}" ItemsSource="{Binding Tools}">
    <StackPanel Orientation="Horizontal">
        <Image Source="{StaticResource ResourceKey=icon}"/>
        <TextBlock Text="{Binding Title}"/>
    </StackPanel>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate DataType="{x:Type model:Location}" ItemsSource="{Binding Locations}">
    <StackPanel Orientation="Horizontal">
        <Image Source="{StaticResource ResourceKey=icon}"/>
        <TextBlock Text="{Binding Title}"/>
    </StackPanel>
</HierarchicalDataTemplate>

但是,要执行此操作,您需要更改Folder类中的集合,如上所述,以便您可以添加顶级ToolLocation那里的物体在一起。如果那些顶级对象只是文件夹&#39;对于实际的项目,你也可以删除它们,因为它们使你的代码变得更加棘手。