我有一个使用 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
对他们的指令。这样,当框架遇到集合中的不同对象时,它们都将由框架显式应用。
更新>>>
再次查看您所需的文件夹结构,您似乎只有一种类型作为顶级节点,即 Tool
和Location
对象是 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
中的集合如上所述,这样您就可以添加顶级 Tool
和Location
里面的物体在一起。如果这些顶级对象只是实际项目的“文件夹”,那么您也可以删除它们,因为它们使您的代码变得更加棘手。
关于c# - 具有分层数据模板和多种类型的 WPF TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042211/