我有一个使用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>
它运行良好但现在我需要在文件夹中添加其他类型的对象以使树视图如下:
工具和位置必须使用不同的DataTemplate。它们都是IList包含在文件夹类(IList<Tool>
和IList<Location>
)中。
甚至可以这样做吗? 我怎样才能做到这一点?
感谢您的帮助
答案 0 :(得分:5)
如果您执行以下任一选项,则可以执行此操作:
1)使用类型为ObservableCollection<object>
的集合属性,以便您可以在其中添加任何对象类型。
2)定义Folder
和Tool
类实现(或扩展)的接口或基类,然后使用类型为ObservableCollection<YourInterface>
或ObservableCollection<YourBaseClass>
的集合属性以便您可以在其中添加任何对象类型。
然后,根据需要定义尽可能多的DataTemplate
,但不要在其上设置任何x:Key
指令。通过这种方式,当它遇到集合中的不同对象时,它们将全部由Framework明确应用。
更新&gt;&gt;&gt;
再次查看所需的文件夹结构,您似乎只有一种类型作为顶级节点,Tool
和Location
对象是Folder
对象的子对象。如果是这样,那么只要Folder
类具有名为Folder
和Folders
的集合属性,就可以使用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
类中的集合,如上所述,以便您可以添加顶级Tool
和Location
那里的物体在一起。如果那些顶级对象只是文件夹&#39;对于实际的项目,你也可以删除它们,因为它们使你的代码变得更加棘手。