【问题标题】:How do I bind to XmlDataProvider whos source has a default namespace (xmlns) set?如何绑定到 XmlDataProvider,其源设置了默认命名空间 (xmlns)?
【发布时间】:2009-12-14 07:28:10
【问题描述】:

我有类似于以下的 XML

<?xml version="1.0" encoding="utf-8"?>
<foo name="FooBar" xmlns="http://mydomain/myapp/ver/myschema.xsd">
    <bars v="test">
        <bar bat="one"/>
        <bar bat="two"/>
        <bar bat="three"/>
    </bars>
</foo>

如何在 WPF 中映射它,如果我不设置默认命名空间,它会起作用,但是当我设置 xmlns 时,我的绑定不匹配任何东西。我已经尝试了以下声明,但是我无法弄清楚如何映射组合框,如下所示。

<Window.Resources>
    <!-- works if xmlns is not set -->
    <XmlDataProvider x:Key="mySource1"
                     XPath="/foo">
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource2"
                     XPath="//*[local-name()='foo']">
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource3"
                     XPath="/foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix=""/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource1}">
    <Label Content="{Binding XPath=@name}"/>
    <Label DataContext="{Binding XPath=bars}"
           Content="{Binding XPath=@v}"/>
</StackPanel>

我正在通过以下代码分配XmlDataProvider.Source 属性。

XmlDataProvider xdp = FindResource("mySource1") as XmlDataProvider;
// ... setup dialog and confirm resource.
using (Stream s = dlg.OpenFile()) {
    XmlDocument doc = new XmlDocument();
    doc.Load(s);
    xdp.Document = doc;
}

任何解决此问题的帮助将不胜感激,谢谢。

更新

根据 Andrews 的建议,我提出了以下建议:

<Window.Resources>
    <XmlDataProvider x:Key="mySource"
                     XPath="/fb:foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix="fb"/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource}">
    <Label Content="{Binding XPath=@name}"/>
    <ComboBox ItemsSource="{Binding XPath=fb:bars/fb:bar}"
              IsSynchronizedWithCurrentItem="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding XPath=@bat}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</StackPanel>

【问题讨论】:

  • 我发现问题源于我的现实世界问题绑定到组合框的 SelectedItem 似乎不适用于命名空间,打开后续问题 @987654321 @

标签: c# wpf xml xaml xpath


【解决方案1】:

你可以试试这个吗?我对 xml 命名空间不太熟悉。

<Window.Resources>
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource3"
                     XPath="/cs:foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix="cs"/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource1}">
    <Label Content="{Binding XPath=@name}"/>
    <Label Content="{Binding XPath=cs:bat}"/>
</StackPanel>

【讨论】:

  • 嗨 Andrew,这为我指明了正确的方向,但是我在映射嵌套元素时仍然遇到问题,我已经更新了我的问题,如上所示。我还更新了 XML 以反映问题。另一方面是我真的不想在我的 XAML 中的任何地方都指定一个前缀,并且不希望这样做。
  • 我试用了您编辑的代码,它似乎可以正常工作而没有绑定错误。我可以看到一个标签“fooBar”和一个带有“一、二、三”的组合框。我不确定是否有办法删除前缀。我以前从未见过它在 xaml 中被删除。
  • 如您所见,它确实有效,但我不确定我的现实世界问题出了什么问题。它正在发生一些奇怪的事情,因为它在没有命名空间的情况下按预期运行。我一定是在某处遗漏了一个前缀并且没有注意到。感谢您的帮助安德鲁。
  • 嗨 Andrew,找到了我一直遇到的问题的根本原因,看来绑定到组合框的 SelectedItem 会造成麻烦。 stackoverflow.com/questions/1909416/…
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2018-08-25
  • 2012-03-13
  • 2011-02-21
相关资源
最近更新 更多