2014-09-25 86 views
2

我有一个树视图创建使用HierarchicalDataTemplate有您可以在下面的代码中看到:WPF树视图以分层数据模板和多类型

<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

工具和位置必须使用不同的DataTemplate。他们都是IList包含在文件夹类(IList<Tool>IList<Location>)。

它甚至有可能做到这一点? 我该如何做到这一点?

感谢您的帮助

回答

4

你可以做,如果你做的下列选项之一:

1)使用ObservableCollection<object>类型的集合属性,以便您可以添加任何对象类型进去。

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

然后,当你需要定义尽可能多的DataTemplate S,但对其设置任何x:Key指令。通过这种方式,当框架遇到集合中的不同对象时,它们都将被框架显式应用。


UPDATE >>>

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

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


更新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 CL:,他们将通过框架隐式应用如上所述,以便您可以将顶级ToolLocation对象添加在一起。如果这些顶级对象只是实际项目的“文件夹”,那么您可以将它们移除,因为它们会让您的代码变得更加棘手。

+1

谢谢,并告诉我,如果我错了,这种解决方案将两种类型(工具和位置)混合使用。即使我对集合进行排序,我也永远无法在树视图中只展开一种类型,对吧? – Desnoxav 2014-09-25 15:46:30

+0

您的更新很好地描述了我想要做的事情。但主要问题是如何技术性地创建分层数据模板。它只能有一个ItemsSource。 – Desnoxav 2014-09-26 15:32:17