WPF XMLDataProvider不适用于XPath的联合

时间:2014-06-01 10:54:56

标签: c# xml wpf xpath

XMLDataProvider不返回具有union的XPath查询的结果。请在代码后的bottam上查看我的问题陈述。

在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
  2. 从绩效角度来看。它将加载XMLDataProvider中的所有屏幕xml节点,而不仅仅是common和screen1。

    1. 原因#2
    2. 在屏幕上工作的开发人员应该只使用控件的节点名称而不使用任何前缀规范。他们不应该关心字符串的位置。因为随着时间的推移,字符串可能会变为普通字符串。

1 个答案:

答案 0 :(得分:0)

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

问题不在于使用XPath联合。即使您不使用union,如果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" />