我想使用 XML 文档的数据绑定来填充一个简单的表单,该表单显示有关人员列表的详细信息。我已经把一切都设置好了,现在就这样工作:
<Window x:Class="DataBindingSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<Window.Resources>
<XmlDataProvider x:Key="xmlProvider" XPath="People" Source="c:\someuri.xml"/>
</Window.Resources>
<Grid>
<ListBox Name="personList" ItemsSource="{Binding Source={StaticResource xmlProvider}, XPath=Person}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<GroupBox Header="GroupBox" Name="groupBox1" DataContext="{Binding ElementName=personList, Path=SelectedItem}">
<Grid>
<TextBox Name="nameText" Text="{Binding XPath=Name}"/>
<ComboBox Name="genderCombo" Text="{Binding XPath=Gender}">
<ComboBoxItem>Male</ComboBoxItem>
<ComboBoxItem>Female</ComboBoxItem>
</ComboBox>
</Grid>
</GroupBox>
</Grid>
</Window>
(为了清楚起见,所有位置/布局元素已被删除)
现在这效果很好!如果我向它提供一些与所提供的路径相匹配的 XML,我会在列表框中得到一个名称列表,单击时会在相应的字段中显示名称和性别。当我开始尝试在 XML 源中使用命名空间时,问题就出现了。然后,XAML 更改为如下所示:
<Window x:Class="DataBindingSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<Window.Resources>
<XmlNamespaceMappingCollection x:Key="namespaceMappings">
<XmlNamespaceMapping Uri="http://www.mynamespace.com" Prefix="mns"/>
</XmlNamespaceMappingCollection>
<XmlDataProvider x:Key="xmlProvider" XmlNamespaceManager="{StaticResource namespaceMappings}" XPath="mns:People" Source="c:\someuriwithnamespaces.xml"/>
</Window.Resources>
<Grid>
<ListBox Name="personList" ItemsSource="{Binding Source={StaticResource xmlProvider}, XPath=mns:Person}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=mns:Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<GroupBox Header="GroupBox" Name="groupBox1" DataContext="{Binding ElementName=personList, Path=SelectedItem}">
<Grid>
<TextBox Name="nameText" Text="{Binding XPath=mns:Name}"/>
<ComboBox Name="genderCombo" Text="{Binding XPath=mns:Gender}">
<ComboBoxItem>Male</ComboBoxItem>
<ComboBoxItem>Female</ComboBoxItem>
</ComboBox>
</Grid>
</GroupBox>
</Grid>
</Window>
使用此代码(当然还有适当的命名空间 xml),列表框仍然可以正确显示名称,但单击这些名称不再更新“名称”和“性别”字段!我怀疑 xml 命名空间以某种方式对 groupbox 的 DataContext 产生不利反应,但我不确定原因或方式。有谁知道如何在这种情况下使用 XML 命名空间?
I also 问了这个问题 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cb6b22e7-3a48-425b-bbad-2575d2618968/在 MSDN WPF 表单上。 Marco Zhou这样回答了我,这也是我最终寻求的答案。我在这里复制了它,以便任何寻找相同答案的人受益:
这有效:
<XmlDataProvider x:Key="dataProvider"
XmlNamespaceManager="{StaticResource namespaceMappings}"
XPath="p:players/p:player">
<x:XData>
<p:players xmlns:p="http://www.footballism.com/2005/SoccerPlayers">
<p:player>
<p:fullName>Sebastian Batistuta</p:fullName>
<p:age>26</p:age>
</p:player>
<p:player>
<p:fullName>Andriey Shevchenko</p:fullName>
<p:age>30</p:age>
</p:player>
<p:player>
<p:fullName>Paviel Nedved</p:fullName>
<p:age>21</p:age>
</p:player>
<p:player>
<p:fullName>David Beckham</p:fullName>
<p:age>19</p:age>
</p:player>
</p:players>
</x:XData>
</XmlDataProvider>
</Page.Resources>
<StackPanel>
<TextBlock
Text="{Binding XPath=p:fullName}"
FontWeight="Bold"
Binding.XmlNamespaceManager="{StaticResource namespaceMappings}"
DataContext="{Binding ElementName=listBox, Path=SelectedItem}"/>
<ListBox ItemsSource="{Binding Source={StaticResource dataProvider}}"
x:Name="listBox"
DisplayMemberPath="p:fullName">
</ListBox>
</StackPanel> </Page>
我想看完代码后,
你应该能够理解为什么
它在指定后起作用
附加 Binding.XmlNamespaceManager
TextBlock 的属性。
ListBox 是数据绑定到数据
具有 xml 命名空间的提供者
映射信息,但绑定
TextBlock 上没有这个
信息,这就是失败的原因。
实际上,在做主细节时
数据绑定,更合适的是
执行如下操作:
<XmlDataProvider x:Key="dataProvider"
XmlNamespaceManager="{StaticResource namespaceMappings}"
XPath="p:players/p:player">
<x:XData>
<p:players xmlns:p="http://www.footballism.com/2005/SoccerPlayers">
<p:player>
<p:fullName>Sebastian Batistuta</p:fullName>
<p:age>26</p:age>
</p:player>
<p:player>
<p:fullName>Andriey Shevchenko</p:fullName>
<p:age>30</p:age>
</p:player>
<p:player>
<p:fullName>Paviel Nedved</p:fullName>
<p:age>21</p:age>
</p:player>
<p:player>
<p:fullName>David Beckham</p:fullName>
<p:age>19</p:age>
</p:player>
</p:players>
</x:XData>
</XmlDataProvider>
</Page.Resources>
<StackPanel DataContext="{Binding Source={StaticResource dataProvider}}">
<TextBlock
Text="{Binding XPath=p:fullName}"
FontWeight="Bold"/>
<ListBox ItemsSource="{Binding}"
x:Name="listBox"
DisplayMemberPath="p:fullName"
IsSynchronizedWithCurrentItem="True">
</ListBox>
</StackPanel> </Page>
希望这能让事情澄清一点
少量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)