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
。它将在XMLDataProvider中加载所有screen xml节点,而不仅仅是普通的和screen1。
- 理由2
在屏幕上工作的开发人员应该只使用控件的节点名称,而不使用任何前缀规范。它们不应该关心字符串的位置。因为随着时间的推移,字符串可能会被移到公共
您的XmlDataProvider
返回多个项目,但由于您使用UI控件显示单个项目(标签和按钮,而不是ListBox, ItemsControl等),您只获得两个UI控件(<Common>...</Common>
元素)显示的第一个项目。
问题不在于使用XPath联合。即使不使用联合,如果XML中有多个同名的元素,使用您的方法也只会显示第一个元素。
要解决这个问题,可以使用下面的XPath声明XmlDataProvider
:
<XmlDataProvider XPath="MyRoot/App1" x:Key="SomeStrings" Source="pack://siteoforigin:,,,/somestrings.xml" />
然后为Label
和Button
使用以下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" />