代码之家  ›  专栏  ›  技术社区  ›  Chris Wenham

当{binding xpath=ns:foo}时需要“名称空间管理器或xsltcontext”

  •  1
  • Chris Wenham  · 技术社区  · 14 年前

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

    当绑定到一个刚从xmldataprovider根目录下恢复的xpath时,名称空间前缀被很好地理解了,我得到了结果。但是,如果从数据模板中尝试执行另一个基于xpath的绑定,则输出窗口在运行时显示此错误:

    由于源节点或路径不正确,无法获取结果节点集合。;source node='integrationprofile';path='i:role'bindingexpression:path=;dataitem='xmlement'(hashcode=19883454);target元素为'tabcontrol'(name='');target属性为'itemssource'(type'ienumerable')xpathexcepaction:'system.xml.xpath.xpathexception:需要命名空间管理器或xsltcontext。此查询具有前缀、变量或用户定义的函数。

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

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

    在数据模板中。名称空间管理器附加在代码中,如下所示:

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

    wpf是否忘记了附加了一个namespacemanager?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Chris Wenham    14 年前

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

    原因: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=“…”旁边的同一个元素中不起作用,但将其作为父元素的属性确实起作用。