数据绑定到XAML中的XmlDataProvider而不显示数据

时间:2016-07-19 15:39:02

标签: c# wpf xaml data-binding

我正在尝试制作一个非常简单的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"搜索参数。

3 个答案:

答案 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>