2010-10-29 92 views
2

注意:請參閱本文底部的解決方案。將XML數據綁定到TreeView並在同一父級下使用不同類型的子節點

我想使用XAML的「HierarchicalDataTemplate」在TreeView中顯示一個xml文檔。 我當前的XAML代碼將顯示「父」節點的第一個子節點,但不會顯示不同類型的後續子節點。

我可以使用XAML在共同父項下顯示不同類型的子項嗎?

爲了說明的目的,我將問題歸結爲非常基本的示例。

我希望我的樹視圖看起來像這樣(減去括號中的東西):

Parent: Roger (Type="Parent") 
|--Rug rats (Type="Children") 
|  |--Bob (Type="Child") 
|  |--Tom 
| 
|--Gear (Type="Equipment") <-- **can't display this or its child nodes** 
     |--Canoe (Type="Item") 
     |--Tent 

在這個例子中,「父」節點有2種類型的子節點; 「兒童」和「設備」。

這裏的XML:

<Parent Name="Roger"> 
    <Children> 
    <Child Name="Bob"/> 
    <Child Name="Tom"/> 
    </Children> 
    <EquipmentList> 
    <Item Name="Canoe"/> 
    <Item Name="Tent"/> 
    </EquipmentList> 
</Parent> 

這裏的XAML數據模板來呈現樹節點:

<Window.Resources> 
    <HierarchicalDataTemplate DataType="Parent" ItemsSource="{Binding XPath=Children}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text=": "/> 
      <TextBlock Text="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="Children" ItemsSource="{Binding XPath=Child}"> 
     <TextBox Width="Auto" Text="Rug Rats" /> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="Child"> 
     <TextBox Width="Auto" Text="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}" /> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="EquipmentList" ItemsSource="{Binding XPath=Item}"> 
     <TextBox Width="Auto" Text="Gear" /> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="Item"> 
     <TextBox Width="Auto" Text="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}" /> 
    </HierarchicalDataTemplate> 

</Window.Resources> 

在完整性的利益,這裏是背後的代碼罷了樹:

_xmlDoc = new XmlDocument(); 
_xmlDoc.Load(@"..\..\SampleXMLFile.xml"); 

treeViewToolDescription.ItemsSource = _xmlDoc; 

我一直在谷歌搜索「XML」,「TreeView」,「HierarchicalDataTemplate」的組合d「異構」了幾天,所以我已經看到(但顯然沒有理解)不少文章,看起來有前途,但從來沒有足夠的相關性。

SOLUTION

的解決方案是使用星號的的ItemsSource讓所有的孩子,無論類型,即的ItemsSource =的 「{結合的XPath = *}」

以前(的ItemsSource集明確鍵入 「兒童」):

<HierarchicalDataTemplate DataType="Parent" ItemsSource="{Binding XPath=Children}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Parent: "/> 
      <TextBlock Text="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

(的ItemsSource設置爲 「*」 代替指定類型):

<HierarchicalDataTemplate DataType="Parent" ItemsSource="{Binding XPath=*}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Parent: "/> 
      <TextBlock Text="{Binding [email protected], UpdateSourceTrigger=PropertyChanged}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

回答

2

簡短的回答是你不能照現在的樣子。您需要創建一個屬性,將給定節點的所有子節點作爲一個屬性進行比較。

因此,在這種情況下,你需要一個子節點屬性類似下面的

Parent.SubNodes => a list {Rug Rats, Gear} 
Children.SubNodes for Rug Rats=> a list {Bob, Tom} 
Equipment.SubNodes for Gear => a list {Canoe, Tent} Items 

,你可以使用的DataTemplates每種類型,從而使得各葉節點的外觀。類似的問題WPF TreeView HierarchicalDataTemplate - binding to object with multiple child collections

相關問題