c# - 具有分层数据模板和多种类型的 WPF TreeView

标签 c# wpf treeview hierarchicaldatatemplate

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

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

它工作得很好,但现在我需要在文件夹中添加其他类型的对象来制作如下 TreeView :

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

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

有可能做到吗? 我怎样才能实现这一目标?

感谢您的帮助

最佳答案

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

1) 使用 ObservableCollection<object> 类型的集合属性这样您就可以向其中添加任何对象类型。

2) 定义 Folder 的接口(interface)或基类和Tool类实现(或扩展),然后使用 ObservableCollection<YourInterface> 类型的集合属性或ObservableCollection<YourBaseClass>这样您就可以向其中添加任何对象类型。

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

<小时/>

更新>>>

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

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

<小时/>

更新2>>>

您可以定义更多HierarchicalDataTemplate s,其中一个为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里面的物体在一起。如果这些顶级对象只是实际项目的“文件夹”,那么您也可以删除它们,因为它们使您的代码变得更加棘手。

关于c# - 具有分层数据模板和多种类型的 WPF TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042211/

相关文章:

c# - WPF 功能区 : Maximized window going off screen

从其他用户控件添加项目时 WPF 更新 UserControl

wpf - 使用 XAML 资源减少重复

python - 创建流程树形式的 json 文件。在Python中

c# - 如何将 WPF TreeView 项的扩展事件绑定(bind)到 View 模型

c# - .Net 为什么GC不从堆中删除对象?

c# - Object() 和 Object{} 的区别

c# - 将具有指数表示法的数字从字符串转换为 double 或十进制

wpf字符串格式不是数字或日期

Delphi: TreeView 的自定义提示