我正在将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?
答案 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 =“...”旁边的相同元素中不起作用,但使其成为父元素的属性。