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:最根本的错误是XmlDataProviderXPath与xml数据的根节点不匹配。将其更改为"Checklist"是最简单的修复方法,不需要修改我的XPath搜索参数。

XAML中绑定到XmlDataProvider的数据未显示数据

首先,从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,只需将XmlDataProviderXPath属性更改为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>