【发布时间】:2010-10-29 13:47:45
【问题描述】:
注意:请参阅本文底部的解决方案。
我正在尝试使用 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 XPath=@Name, 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 XPath=@Name, UpdateSourceTrigger=PropertyChanged}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="EquipmentList" ItemsSource="{Binding XPath=Item}">
<TextBox Width="Auto" Text="Gear" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="Item">
<TextBox Width="Auto" Text="{Binding XPath=@Name, UpdateSourceTrigger=PropertyChanged}" />
</HierarchicalDataTemplate>
</Window.Resources>
为了完整起见,下面是填充树的代码:
_xmlDoc = new XmlDocument();
_xmlDoc.Load(@"..\..\SampleXMLFile.xml");
treeViewToolDescription.ItemsSource = _xmlDoc;
几天来,我一直在谷歌搜索“XML”、“TreeView”、“HierarchicalDataTemplate”和“异构”的组合,所以我已经看到(但显然不理解)很多看起来的文章 很有希望,但似乎从来没有足够的相关性。
解决方案
解决方案是对 ItemsSource 使用星号来获取所有子项,而不考虑类型,即 ItemsSource="{Binding XPath=*}"
之前(ItemsSource 明确设置为键入“Children”):
<HierarchicalDataTemplate DataType="Parent" ItemsSource="{Binding XPath=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Parent: "/>
<TextBlock Text="{Binding XPath=@Name, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</HierarchicalDataTemplate>
之后(ItemsSource 设置为“*”而不是指定类型):
<HierarchicalDataTemplate DataType="Parent" ItemsSource="{Binding XPath=*}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Parent: "/>
<TextBlock Text="{Binding XPath=@Name, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</HierarchicalDataTemplate>
【问题讨论】:
标签: wpf xml data-binding treeview