.net &引用;需要名称空间管理器或XsltContext“;当{Binding XPath=ns:Foo}

.net &引用;需要名称空间管理器或XsltContext“;当{Binding XPath=ns:Foo},.net,wpf,data-binding,.net,Wpf,Data Binding,我正在将数据模板绑定到XmlDataProvider。由于所讨论的XML数据使用名称空间,我还将XmlNamespaceManager附加到XmlDataProvider,并将前缀映射到它 当绑定到XmlDataProvider根以外的XPath时,名称空间前缀可以很好地理解,我得到了结果。但是,如果我尝试从DataTemplate中执行另一个基于XPath的绑定,则输出窗口会在运行时显示此错误: 由于源节点或路径错误,无法获取结果节点集合。;SourceNode='IntegrationPro

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

当绑定到XmlDataProvider根以外的XPath时,名称空间前缀可以很好地理解,我得到了结果。但是,如果我尝试从DataTemplate中执行另一个基于XPath的绑定,则输出窗口会在运行时显示此错误:

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

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

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

WPF是否忘记了附加了名称空间管理器?

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

原因:DataTemplate的DataContext绑定到第一个查询中选择的子元素,并且作用域不会“返回”到NamespaceManager的附加位置

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

<Window.Resources>
    <XmlNamespaceMappingCollection x:Key="MyNamespaces">
        <XmlNamespaceMapping Uri="http://foo.com/MyNamespace" Prefix="i"/>
    </XmlNamespaceMappingCollection>
    ...
</Window.Resources>
将其放在ItemSource=“…”旁边的同一元素中不起作用,但将其作为父元素的属性起作用

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