WPF XMLDataProvider不能用于XPath的联合

本文关键字:XPath 用于 XMLDataProvider 不能 WPF | 更新日期: 2023-09-27 18:06:03

XMLDataProvider没有返回具有联合的XPath查询的结果。请参阅我的问题声明在底部的代码后。

在WPF XMLDataProvider,我使用下面的somestrings.xml如下,

<?xml version="1.0" encoding="utf-8" ?>
<MyRoot>
<App1>
    <Common>
    <ApplicationName>Online Games</ApplicationName>
    </Common>
   <Screen1>
    <SelectGameshButtonName>Select Games</SelectGameshButtonName>
   </Screen1>  
   <Screen2>
    <FinishButtonName>Finish Purchase</FinishButtonName>    
   </Screen2>  
</App1>
</MyRoot>
XAML代码是
<Window x:Class="WPF_XML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <XmlDataProvider x:Key="SomeStrings" Source="pack://siteoforigin:,,,/somestrings.xml"  XPath="MyRoot/App1/Common|MyRoot/App1/Screen1"/>
    </Window.Resources>  
    <Grid >
        <Label Content="{Binding Source={StaticResource SomeStrings}, XPath=ApplicationName}" Height="28" HorizontalAlignment="Left" Margin="38,82,0,0" Name="lblName" VerticalAlignment="Top" Width="107" />
        <Button Content="{Binding Source={StaticResource SomeStrings}, FallbackValue=oops, XPath=SelectGameshButtonName}" Height="24" HorizontalAlignment="Left" Margin="169,82,0,0" Name="btnSelect" VerticalAlignment="Top" Width="104" />
    </Grid>
</Window>

使用XMLDataProvider,我试图从xml文件分配显示文本到控件。以下是我的观察,

XPath="MyRoot/App1/Common"  then label gets value.
XPath="MyRoot/App1/Screen1"  then button gets value

由于我希望两个控件都在单个查询中获得值,因此使用XPath的联合,

XPath="MyRoot/App1/Common|MyRoot/App1/Screen1"

但是我只看到标签正在更新。

为什么XMLDataProvider不能将按钮名称返回给绑定。

这是XMLDataProvider的问题还是我错过了什么?

感谢

编辑

尽管在XMLDataProvider中设置XPath="MyRoot/App1"并设置控件内容绑定,

XPath="Common/ApplicationName|Screen1/ApplicationName" 
XPath="Common/SelectGameshButtonName|Screen1/SelectGameshButtonName" 

可以正常工作!但是我不想使用这种方法,

  1. 原因# 1
从性能角度看

。它将在XMLDataProvider中加载所有screen xml节点,而不仅仅是普通的和screen1。

    理由2

在屏幕上工作的开发人员应该只使用控件的节点名称,而不使用任何前缀规范。它们不应该关心字符串的位置。因为随着时间的推移,字符串可能会被移到公共

WPF XMLDataProvider不能用于XPath的联合

您的XmlDataProvider返回多个项目,但由于您使用UI控件显示单个项目(标签和按钮,而不是ListBox, ItemsControl等),您只获得两个UI控件(<Common>...</Common>元素)显示的第一个项目。

问题不在于使用XPath联合。即使不使用联合,如果XML中有多个同名的元素,使用您的方法也只会显示第一个元素。

要解决这个问题,可以使用下面的XPath声明XmlDataProvider:
<XmlDataProvider XPath="MyRoot/App1" x:Key="SomeStrings" Source="pack://siteoforigin:,,,/somestrings.xml"  />

然后为LabelButton使用以下XPath:

<Label Content="{Binding Source={StaticResource SomeStrings}, XPath=Common/ApplicationName}" Height="28" HorizontalAlignment="Left" Margin="38,82,0,0" Name="lblName" VerticalAlignment="Top" Width="107" />
<Button Content="{Binding Source={StaticResource SomeStrings}, FallbackValue=oops, XPath=Screen1/SelectGameshButtonName}" Height="24" HorizontalAlignment="Left" Margin="169,82,0,0" Name="btnSelect" VerticalAlignment="Top" Width="104" />