【问题标题】:WPF Tree View with Hierarchical data template and multi types具有分层数据模板和多种类型的 WPF 树视图
【发布时间】:2014-09-25 15:20:14
【问题描述】:

我有一个使用 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

工具和位置必须使用不同的数据模板。它们都是 IList 包含在文件夹类中(IList&lt;Tool&gt;IList&lt;Location&gt;)。

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

感谢您的帮助

【问题讨论】:

    标签: c# wpf treeview hierarchicaldatatemplate


    【解决方案1】:

    如果您执行以下选项之一,则可以这样做:

    1) 使用ObservableCollection&lt;object&gt; 类型的集合属性,以便您可以向其中添加任何对象类型。

    2) 定义FolderTool 类实现(或扩展)的接口或基类,然后使用ObservableCollection&lt;YourInterface&gt;ObservableCollection&lt;YourBaseClass&gt; 类型的集合属性,以便您可以添加任何对象类型进入它。

    然后,根据需要定义任意数量的DataTemplate,但不要在它们上设置任何x:Key 指令。这样,当框架遇到集合中的不同对象时,它们都将被显式应用。


    更新>>>

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

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


    更新 2 >>>

    您可以定义更多HierarchicalDataTemplates,一个用于Tool,一个用于Location 类...只要您提供x:Key 指令,它们将被框架隐式应用:

    <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 对象一起添加到其中。如果这些顶级对象只是实际项目的“文件夹”,那么您不妨删除它们,因为它们会使您的代码变得更加棘手。

    【讨论】:

    • 谢谢,如果我错了,请告诉我,使用此解决方案,两种类型(工具和位置)将混合在一起。即使我对集合进行排序,我也永远无法在树视图中仅扩展一种类型,对吧?
    • 您的更新很好地描述了我想要做的事情。但主要问题是如何在技术上创建分层数据模板。它只能有一个 ItemsSource。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多