Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个结果转换为逗号分隔字符串的WPF XPath绑定_Wpf_Xml_Xpath_Binding - Fatal编程技术网

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

多个结果转换为逗号分隔字符串的WPF XPath绑定,wpf,xml,xpath,binding,Wpf,Xml,Xpath,Binding,我有一个结构类似于以下内容的XML文件: 5 3 5 1 在我的XAML中,我将ListView绑定到XML文件,并将ListViewItem的DataTemplate设置为绑定,如下所示: <DataTemplate> <TextBlock Text="{Binding}"/>, </DataTemplate> 显然,我希望这个XPath查询有4个结果,但我似乎找不到将结果转换为逗号分隔字符串的方法,现在,TextBlock只显示第一个值

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



5
3
5
1

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

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

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


如果我使用相同的XPath查询来设置ListBox的ItemsSource,我将获得ListBox中的所有结果,因此我认为我应该能够获得传递给转换器类的所有值…

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

MyListView.ItemsSource = XElement.Load(@"XMLFile1.xml").Elements("Child");
并绑定到TextBlock中的Value属性:

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

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

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

更新

由于XPath引擎执行预强制,IValueConverter建议无法工作,因此我建议您执行以下操作:与其绑定到单个TextBlock,不如绑定到ItemsControl,并为ItemsControl定义ItemTemplate,如下所示:

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

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

最后,根据您希望数据布局的方式,还可以设置ItemsControl的ItemsPanel。我假设您想要水平流,在这里进行包裹:

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


也许,我没有很好地了解您,但我恐怕我的ListView比单个ListViewItem要复杂一点。我试图在没有太多代码的情况下完成这项工作,因为“似乎”应该有一种方法来转换返回多个结果的XPath查询。在我编写的IValueConverter中,似乎传递了一个字符串,但由于它是作为类型对象传递的,所以我希望调试器正在执行一些简单的强制转换之类的操作。正如我所说,这在绑定时效果很好,所以我猜在调用IValueConverter之前有强制,我只是无法确认。我不能说我感到惊讶。如果他们在封面下使用SelectNodes(我相信他们是这样的),那么节点集到单个值的标准XPath转换就是从集合中获取第一个节点。我将编辑我的答案,并为你提供第二条建议。谢谢,德鲁。我很感谢后续的工作,因为这可能为我节省了一点时间,因为我正在模板化一个列表框(ha),而不是直接进入源代码-ItemsControl。