2010-10-29 93 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

相关问题