[英]Binding data from XmlDataProvider to a ListBox fails in XAML in WPF
[英]Data binding to an XmlDataProvider in XAML not displaying data
我试图做一个非常简单的ListBox
视图,该视图将短列表中的项目显示为标签。 但是,窗口弹出空白。 XAML:
<Window x:Class="ReCheckList.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ReCheckList"
mc:Ignorable="d"
Title="MainWindow" Height="298" Width="192">
<Window.Resources>
<!----- Data Source ---------->
<XmlDataProvider x:Key="PackingListDataSource" XPath="cList">
<x:XData>
<Checklist xmlns="">
<ListNode Title="Socks"/>
<ListNode Title="Shoes"/>
<ListNode Title="Toothbrush"/>
</Checklist>
</x:XData>
</XmlDataProvider>
<!--- Data Template ----------->
<DataTemplate x:Key="ListNodeTemplate">
<Label Content="{Binding XPath=@Title}"></Label>
</DataTemplate>
</Window.Resources>
<Grid>
<!------ ListBox ------->
<ListBox ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath=ListNode}"
ItemTemplate="{StaticResource ListNodeTemplate}">
</ListBox>
</Grid>
我的数据绑定有什么问题?
编辑:最根本的错误是XmlDataProvider
的XPath
与xml数据的根节点不匹配。 将其更改为"Checklist"
是最简单的解决方法,不需要修改XPath
搜索参数。
ListNode
似乎就像这里的XPath一样,您的意思是//ListNode
或/Checklist/ListNode
吗? 另外,您在提供程序上设置了一个未出现在数据中的XPath
,这将删除它。
首先,从XmlDataProvider
删除XPath
属性
<XmlDataProvider x:Key="PackingListDataSource">
<x:XData>
<Checklist xmlns="">
<ListNode Title="Socks"/>
<ListNode Title="Shoes"/>
<ListNode Title="Toothbrush"/>
</Checklist>
</x:XData>
</XmlDataProvider>
然后,在ItemsSource
绑定中修复XPath
,以便它返回XML中的所有ListNode。 实际上,您可能希望将其范围进一步缩小,但这至少可以使我在ListBox
获得项目。
<ListBox
ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='//ListNode'}"
ItemTemplate="{StaticResource ListNodeTemplate}"
>
</ListBox>
//
表示“在整个XML树中搜索具有该名称的任何元素”。 忽略这一点,您仅在搜索要查找的元素中查找具有该名称的任何内容。 在这种情况下,您正在寻找根源。 您可以通过在路径的/CheckList/ListNode
加一个斜杠/CheckList/ListNode
来显式地从根开始该路径。
或者,(我在这里学习),您可以将绑定的XPath保留不变,只需将XmlDataProvider
的XPath
属性更改为Checklist
,这样您的绑定将在Checklist
查找ListNode
元素。 您的问题确实只是该XPath
属性的cList
错误,因为在XML的根目录中没有任何名为cList
东西。
<XmlDataProvider x:Key="PackingListDataSource" XPath="Checklist">
<x:XData>
<Checklist xmlns="" Title="Foo">
<ListNode Title="Socks"/>
<ListNode Title="Shoes"/>
<ListNode Title="Toothbrush"/>
</Checklist>
</x:XData>
</XmlDataProvider>
...
<ListBox
ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='ListNode'}"
ItemTemplate="{StaticResource ListNodeTemplate}"
>
</ListBox>
请记住,XML区分大小写,因此Checklist
不是CheckList
。 当我说您需要记住这一点时,我真的是说我忘记了。
<!-- change the XPath to "Checklist" -->
<XmlDataProvider x:Key="PackingListDataSource" XPath="cList">
<x:XData>
<Checklist xmlns="">
<ListNode Title="Socks"/>
<ListNode Title="Shoes"/>
<ListNode Title="Toothbrush"/>
</Checklist>
</x:XData>
</XmlDataProvider>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.