注意:請參閱本文底部的解決方案。將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>