2014-09-25 75 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

相關問題