XAML中绑定到XmlDataProvider的数据未显示数据
本文关键字:数据 显示 XmlDataProvider 绑定 XAML | 更新日期: 2023-09-27 17:57:36
我正在尝试制作一个非常简单的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>
我的数据绑定出了什么问题?
EDIT:最根本的错误是XmlDataProvider
的XPath
与xml数据的根节点不匹配。将其更改为"Checklist"
是最简单的修复方法,不需要修改我的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中的所有ListNodes。在实践中,您可能想进一步缩小范围,但这至少让我在ListBox
中获得了项目。
<ListBox
ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='//ListNode'}"
ItemTemplate="{StaticResource ListNodeTemplate}"
>
</ListBox>
//
的意思是"在整个XML树中搜索任何具有此名称的元素"。如果不考虑这一点,您只会在所要查找的元素中搜索具有该名称的任何内容。在这种情况下,您正在查看根源。您可以通过在路径前面加一个斜杠来显式地从根开始该路径:/CheckList/ListNode
。
或者(我在这里学习),您可以保留绑定XPath,只需将XmlDataProvider
的XPath
属性更改为Checklist
,这样您的绑定将在Checklist
中查找ListNode
元素。您的问题实际上只是cList
对于XPath
属性是错误的,因为在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
。当我说你需要记住这一点时,我的意思是我忘了。
ListNode
在这里似乎是错误的XPath,你指的是//ListNode
还是/Checklist/ListNode
?此外,如果在数据中未显示的提供程序上设置XPath
,则会将其删除。
<!-- 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>