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

Des*_*xav 2 c# wpf treeview hierarchicaldatatemplate

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

  <TreeView ItemsSource="{Binding AllFolders}" SelectedItemChanged="TreeView_SelectedItemChanged"/>
Run Code Online (Sandbox Code Playgroud)

            <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>
Run Code Online (Sandbox Code Playgroud)

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

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

工具和位置必须使用不同的DataTemplate.它们都是IList包含在Folder Class(IList<Tool>IList<Location>)中.

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

谢谢你的帮助

She*_*dan 5

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

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

2)定义的接口或基类的FolderTool类实现(或延伸),然后使用所述类型的集合属性ObservableCollection<YourInterface>ObservableCollection<YourBaseClass>,以便可以添加任何对象类型到它.

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


更新>>>

再看一下您想要的文件夹结构,看起来您只有一种类型作为顶级节点,其中ToolLocation对象是对象的子节点Folder.如果是这样,那么你可以使用的集合Folder对象,只要Folder类已经集合属性命名FoldersLocations.

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


更新2 >>>

你可以定义更多的HierarchicalDataTemplates,一个用于类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>
Run Code Online (Sandbox Code Playgroud)

但是,要执行此操作,您需要更改Folder类中的集合,如上所述,以便您可以同时添加顶层ToolLocation对象.如果这些顶级对象只是实际项目的"文件夹",那么您也可以删除它们,因为它们会使您的代码变得更加棘手.