将多个结果转换为逗号分隔字符串的 WPF XPath 绑定(bind)

标签 wpf xml xpath binding

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

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

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

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

显然,对于此 XPath 查询,我期望得到 4 个结果,但我似乎找不到将结果转换为逗号分隔字符串的方法,而现在,TextBlock 仅显示第一个值。

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

最佳答案

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

老实说,我自己还没有尝试过,目前也没有时间,但我希望它能起作用的唯一方法是编写自定义 IValueConverter。我假设它将传递一个 XmlNodeList 作为要转换的值,然后您可以枚举这些节点并自己连接一个逗号分隔的字符串。

更新

由于 XPath 引擎执行预强制转换,因此 IValueConverter 建议不起作用,因此我建议您这样做:不要绑定(bind)到单个 TextBlock,而是绑定(bind)到 ItemsControl 并将 ItemsControl 的 ItemTemplate 定义为如下:

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

注意:老实说,我在 DataTemplate 中采用了惰性方法,即使现在在最后一项之后,您也会以逗号结尾。也就是说,您应该能够定义一个带有触发器的 DataTemplate,该触发器确定它是最后一项并且不显示逗号。

最后,根据您希望数据布局的方式,还可以设置 ItemsControl 的 ItemsPanel。我假设您想要水平流动并在此处环绕:

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

关于将多个结果转换为逗号分隔字符串的 WPF XPath 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1626352/

相关文章:

c# - WPF MVVM 和 View 继承

c# - 选择子节点,但使用 XPath 忽略非元素?

xml - Bash 将 XML 解析为逗号分隔列表

c# - 如何将 Canvas 绑定(bind)到矩形列表

wpf - WPFToolKit DataGrid中的动画行消失

c# - 检测自定义 wpf 文本框上的绑定(bind)错误

java - 使用属性文件中的值的 xml Spring 配置

java - Jaxb 结合 xml

python-3.x - 如何使用 Selenium 按 class_name 从大学橄榄球数据中抓取图像 url 列表

XSLT 使用字符串匹配修改身份规则