繁体   English   中英

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

[英]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>

我的数据绑定有什么问题?


编辑:最根本的错误是XmlDataProviderXPath与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保留不变,只需将XmlDataProviderXPath属性更改为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM