将任何XML文档绑定到WPF TreeView

7
我希望使用TypeConverter将任何XML文档绑定到WPF TreeView。我的原始解决方案是使用递归,但是当文档很大时,UI会被严重卡住。以下链接讨论了TypeConverter,但是只适用于特定的节点/元素组合:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340。如果不知道XML文档的外观如何怎么办?由于这仅用于显示目的,因此我在此阶段并不太关心功能,我只想将XML绑定到TreeView。
3个回答

6

它适用于其他节点类型,只需进行一些简单的修改即可。首先,必须将HierarchicalDataTemplate.ItemsSource绑定XPath更改为“child :: node()| attribute :: *”,以允许任何子节点和任何属性。然后,为其他NodeTypes添加DataTriggers。下面的示例对我有效。请注意,我添加了各种NodeTypes的图标,您可能希望将它们移除:

        <HierarchicalDataTemplate x:Key="NodeTemplate">
        <StackPanel Orientation="Horizontal">
        <Image x:Name="icon" VerticalAlignment="Center" Margin="1,1,4,1"/>
        <TextBlock x:Name="name" Text="" />
        <TextBlock x:Name="inter" Text="" />
        <TextBlock x:Name="value" Text="" />
        </StackPanel>
        <HierarchicalDataTemplate.ItemsSource>
            <Binding XPath="child::node()|attribute::*" />
        </HierarchicalDataTemplate.ItemsSource>
        <HierarchicalDataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                <Setter TargetName="icon" Property="Source" Value="icons/element.png"></Setter>
                <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                <Setter TargetName="icon" Property="Source" Value="icons/text.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Attribute">
                <Setter TargetName="icon" Property="Source" Value="icons/attribute.png"></Setter>
                <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter>
                <Setter TargetName="inter" Property="Text" Value=": "></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="CDATA">
                <Setter TargetName="icon" Property="Source" Value="icons/cdata.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Comment">
                <Setter TargetName="icon" Property="Source" Value="icons/comment.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="ProcessingInstruction">
                <Setter TargetName="icon" Property="Source" Value="icons/pi.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
        </HierarchicalDataTemplate.Triggers>
    </HierarchicalDataTemplate>

3

我曾经问过一个问题,如何以以下方式将任何XML文档绑定到树视图中,而不考虑其模式: 1.通过XML提供程序和分层数据模板将XML文档绑定到WPF TreeView。 2.以以下格式显示XML文档的所有节点,包括具有子节点的节点:

>节点1

节点1内容

    >ChildNode1

       ChildNode1 Contents

            >ChildNode1'sChildNode

              ChildNode1'sChildNode Contents

>节点2

  Node2 Contents

问题在于我的TreeView将每个XmlNode的名称属性绑定到TreeItem。在文本XmlNode的情况下,它会将#text绑定到TreeItem,这不是我想要的。
通过在MSDN论坛上发布帖子,我得到了答案: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cbdb2420-1403-436f-aa7f-b1e3b1acb398/ 所以诀窍是使用触发器根据遇到的节点类型设置值。
注意事项是其他类型的节点将被忽略,XML文档可能包含不同的元素,因此这可能无法适用于遇到的每种节点类型。
这是XAML:
<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="250" Width="450">

<Window.Resources>
    <HierarchicalDataTemplate x:Key="NodeTemplate">
        <TextBlock x:Name="text" Text="?" />
        <HierarchicalDataTemplate.ItemsSource>
            <Binding XPath="child::node()" />
        </HierarchicalDataTemplate.ItemsSource>
        <HierarchicalDataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                <Setter TargetName="text" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                <Setter TargetName="text" Property="Text" Value="{Binding Path=Name}"></Setter>
            </DataTrigger>
        </HierarchicalDataTemplate.Triggers>            
    </HierarchicalDataTemplate>
    <XmlDataProvider x:Key="xmlDataProvider"></XmlDataProvider>
</Window.Resources>

<Grid >
    <TreeView Name="treeView1"
              Background="AliceBlue"
              ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}"
              ItemTemplate= "{StaticResource NodeTemplate}"/>
</Grid>

public Window1()
{
InitializeComponent();
XmlDataProvider dataProvider = this.FindResource("xmlDataProvider") as XmlDataProvider;
        XmlDocument doc = new XmlDocument();
            // Testdocument        doc.LoadXml(
            @"<root>
                <child1>text1<child11>text11</child11>
                </child1>
                <child2>text2<child21>text21</child21>
                    <child22>text22</child22>
                </child2>
              </root>");
        dataProvider.Document = doc;
    }

1

请看我在以下主题中的回答 - 将XML数据绑定到WPF树形视图控件,我相信这正是您要寻找的。线程中的链接指向一个帖子,其中提供了一个逐步示例,并提供下载源代码的选项。该示例编写方式使得可以将任何 XML 文档绑定到 WPF 树形视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接