我正在尝试制作一个非常简单的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>
我的数据绑定有什么问题?
编辑:最根本的错误是XPath
的{{1}}与xml数据的根节点不匹配。将其更改为XmlDataProvider
是最简单的修复,无需修改我的"Checklist"
搜索参数。
答案 0 :(得分:1)
ListNode
似乎就像错误的XPath一样,您的意思是//ListNode
还是/Checklist/ListNode
?此外,您在提供程序上设置了XPath
,但未删除该数据。
答案 1 :(得分:1)
首先,从XPath
XmlDataProvider
属性
<XmlDataProvider x:Key="PackingListDataSource">
<x:XData>
<Checklist xmlns="">
<ListNode Title="Socks"/>
<ListNode Title="Shoes"/>
<ListNode Title="Toothbrush"/>
</Checklist>
</x:XData>
</XmlDataProvider>
然后,在XPath
绑定中修复ItemsSource
,以便返回XML中的所有ListNode。在实践中,您可能希望将其缩小范围,但这至少会让我获得ListBox
中的项目。
<ListBox
ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='//ListNode'}"
ItemTemplate="{StaticResource ListNodeTemplate}"
>
</ListBox>
//
表示“在整个XML树中搜索具有此名称的任何元素”。除此之外,你只是搜索你正在寻找的那个有这个名字的元素。在这种情况下,您正在查看根。您可以通过使用单个斜杠为路径添加前缀来显式启动路径:/CheckList/ListNode
。
或者(我在这里学习),您可以保留绑定XPath,只需将XPath
的{{1}}属性更改为XmlDataProvider
,因此,您的绑定会在Checklist
中查找Checklist
个元素。您的问题实际上只是因为ListNode
属性cList
错误,因为您的XML根目录中没有任何名为XPath
的内容。
cList
请注意,XML区分大小写,因此<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>
不是Checklist
。当我说你需要记住它时,我的意思是我忘了它。
答案 2 :(得分:0)
<!-- 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>