{绑定XPath = ns:Foo}时需要“命名空间管理器或XsltContext”

时间:2010-03-10 19:05:22

标签: .net wpf data-binding

我正在将DataTemplates绑定到XmlDataProvider。由于所讨论的XML数据使用了命名空间,我还将XmlNamespaceManager附加到XmlDataProvider并将前缀映射到它。

当从XmlDataProvider的根目录绑定到XPath之后,命名空间前缀就可以理解了,我得到了结果。但是,如果从DataTemplate中我尝试进行另一个基于XPath的绑定,则Output窗口会在运行时显示此错误:

由于源节点错误或路径错误,无法获取结果节点集合。 SourceNode = 'IntegrationProfile'; Path ='i:Role'BindingExpression:Path =; DataItem ='XmlElement'(HashCode = 19883454); target元素是'TabControl'(Name =''); target属性是'ItemsSource'(类型'IEnumerable')XPathException:'System.Xml.XPath.XPathException:需要命名空间管理器或XsltContext。此查询具有前缀,变量或用户定义的函数。

此错误是由这行XAML引起的:

<TabControl ItemsSource="{Binding XPath=i:Role}"/>

位于DataTemplate中。 NamespaceManager附加在代码中,如下所示:

_profile = new XmlDataProvider();
_profile.Document = new XmlDocument();
_profile.Document.Load(ProfilePath);
_profile.XmlNamespaceManager = NamespaceManager;

WPF是否忘记了附加了NamespaceManager?

1 个答案:

答案 0 :(得分:0)

自己找到原因和解决方案。

原因:DataTemplate的DataContext绑定到第一个查询中选择的子元素,并且范围不会“返回”到NamespaceManager所连接的位置。

解决方案:在资源块中创建一个XmlNamespaceMappingCollection:

<Window.Resources>
    <XmlNamespaceMappingCollection x:Key="MyNamespaces">
        <XmlNamespaceMapping Uri="http://foo.com/MyNamespace" Prefix="i"/>
    </XmlNamespaceMappingCollection>
    ...
</Window.Resources>

然后将以下属性放在任何控件的父元素中,在其绑定中进行XPath查询:

Binding.XmlNamespaceManager="{StaticResource MyNamespaces}"

将它放在ItemSource =“...”旁边的相同元素中不起作用,但使其成为父元素的属性。