【问题标题】:XML databinding to TreeView with child nodes of different types under the same parentXML 数据绑定到 TreeView,在同一父节点下具有不同类型的子节点
【发布时间】: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


    【解决方案1】:

    简短的回答是你不能就这样。您需要创建一个属性,将给定节点的所有子节点作为一个属性进行整理。

    所以在这种情况下,您需要像下面这样的 SubNodes 属性

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2012-01-21
      • 2013-04-16
      相关资源
      最近更新 更多