我想使用TypeConverter将任何XML文档绑定到WPF TreeView。
我最初的解决方案是使用递归,但是当文档很大时,用户界面非常紧张。
以下链接讨论TypeConverter,但针对特定节点/元素组合: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340
如果不知道XML文档是什么样的,该怎么办?由于这仅用于显示目的,因此我不太关心功能,我只想将XML绑定到TreeView。
答案 0 :(得分:6)
通过一些简单的修改,它适用于其他节点类型。首先,HierarchicalDataTemplate.ItemsSource绑定XPath必须更改为“child :: node()| attribute :: *”以允许任何子节点和任何属性。然后,为其他NodeType添加DataTriggers。下面的例子对我有用。请注意,我添加了各种NodeType的图标,您可能希望将其删除:
<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>
答案 1 :(得分:3)
所以我问了一个关于如何通过以下方式将任何XML文档绑定到树视图的问题: 1.通过XML Provider和HierarchicalDataTemplate将XML文档绑定到WPF TreeView。 2.显示XML文档的所有节点,包括具有以下格式的子节点的节点:
&gt; Node1
Node1内容
>ChildNode1
ChildNode1 Contents
>ChildNode1'sChildNode
ChildNode1'sChildNode Contents
&GT;节点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;
}
答案 2 :(得分:1)
在下面的帖子中查看我的答案 - Binding XML data to WPF treeview Control我相信这正是您正在寻找的内容。主题中的链接指向一个帖子,该帖子为您提供了一个分步示例下载源代码的选项。示例的编写方式是将任何 XML文档绑定到WPF树视图