将XML数据绑定到TreeView并在同一父级下使用不同类型的子节点
注意:请参阅本文底部的解决方案。将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>
简短的回答是你不能照现在的样子。您需要创建一个属性,将给定节点的所有子节点作为一个属性进行比较。
因此,在这种情况下,你需要一个子节点属性类似下面的
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