具有多个结果的WPF XPath绑定转换为逗号分隔的字符串

时间:2009-10-26 18:03:46

标签: wpf xml xpath binding

我有一个类似于以下结构的XML文件:

<Parent>
<Child>5</Child>
<Child>3</Child>
<Child>5</Child>
<Child>1</Child>
</Parent>

在我的XAML中,我有一个绑定到XML文件的ListView,并将ListViewItem的DataTemplate设置为绑定,如下所示:

<TextBlock Text="{Binding XPath=Parent/Child}"/>

显然,我期待这个XPath查询有4个结果,但我似乎无法找到将结果转换为逗号分隔字符串的方法,而现在,TextBlock只显示第一个值。

如果我使用相同的XPath查询来设置ListBox的ItemsSource,我会在ListBox中获得所有结果,所以我认为我应该能够将所有值传递给Converter类...

2 个答案:

答案 0 :(得分:1)

没有办法让XPath查询返回多个节点,例如你的节点,将它们聚合成一个值。发生的事情是返回一个节点集,并且由于您绑定到单个字符串属性,因此基础结构只是通过从集合中抓取第一个节点然后抓取其@text节点来强制该节点集。

老实说,我自己并没有尝试过,现在没有时间,但我希望这种方法能够工作的唯一方法就是你写了一个自定义的IValueConverter。我假设它将把一个XmlNodeList作为要转换的值,然后你可以枚举这些节点并自己连接一个逗号分隔的字符串。

<强>更新

由于IVathueConverter建议由于XPath引擎执行预强制而无效,因此我建议您这样做:而不是绑定到单个TextBlock,而是绑定到ItemsControl,并为ItemsControl定义ItemTemplate为如下:

<DataTemplate>
    <TextBlock Text="{Binding}"/>,
</DataTemplate>

注意:老实说我在DataTemplate中采取了懒惰的方法,即使在最后一项之后你也会得到一个逗号。这就是说你应该能够定义一个带有触发器的DataTemplate,它确定它是最后一个项目并且不显示逗号。

最后,根据您希望数据布局的方式,还可以设置ItemsControl的ItemsPanel。我假设你想要包装的水平流程:

<ItemsPanelTemplate>
    <WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>

答案 1 :(得分:0)

如果要将XML数据设置为ListView的源,可以这样做:

MyListView.ItemsSource = XElement.Load(@"XMLFile1.xml").Elements("Child");

并绑定到TextBlock中的Value属性:

<TextBlock Text="{Binding Path=Value}" />

如果需要修改查询,可以将XML文件的内容解压缩到可以在ListView上用作ItemsSource的var。

XElement xmlData = XElement.Load(@"XMLFile1.xml");
var query = from x in xmlData.Elements("Child")
            select x;