【问题标题】:"Namespace Manager or XsltContext needed" when {Binding XPath=ns:Foo}{Binding XPath=ns:Foo} 时“需要命名空间管理器或 XsltContext”
【发布时间】:2011-01-26 01:23:20
【问题描述】:

我将 DataTemplates 绑定到 XmlDataProvider。由于所讨论的 XML 数据使用了命名空间,因此我还将 XmlNamespaceManager 附加到 XmlDataProvider 并为其映射了一个前缀。

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

由于源节点错误或路径错误,无法获取结果节点集合。 SourceNode='IntegrationProfile'; Path='i:Role' BindingExpression:Path=; DataItem='XmlElement' (HashCode=19883454);目标元素是'TabControl'(名称='');目标属性是 '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?

【问题讨论】:

    标签: .net wpf data-binding


    【解决方案1】:

    自己找到原因和解决办法。

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

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

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

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

    Binding.XmlNamespaceManager="{StaticResource MyNamespaces}"
    

    将它放在 ItemSource=".​​.." 旁边的同一个元素中不起作用,但将其作为父元素的属性可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2019-10-05
      相关资源
      最近更新 更多