覆盖数据绑定(XML/XPath) TreeView中特定节点的默认模板

本文关键字:节点 默认 TreeView 数据绑定 XML XPath 覆盖 | 更新日期: 2023-09-27 18:09:47

TL;DR在前面:我想使用一个"默认的" HierarchicalDataTemplate在WPF TreeView中除了特定的几个节点。这些节点来自XMLDocument,直到运行时才完全知道。有办法做到这一点吗?

在运行时,我正在分析系统的特定部分,并构建一个XML文档,然后像这样绑定到TreeView:

MyTree.DataContext = MyXMLDocument;

这是我对TreeView的WPF声明:

<TreeView x:Name="MyTree" ItemsSource="{Binding Mode=OneWay, XPath=/Analysis}" ItemTemplate="{StaticResource GenericElementWithChildren}"/>

模板是这样开始的…

<HierarchicalDataTemplate x:Key="GenericElementWithChildren" ItemsSource="{Binding XPath=child::node()}">

例如,我可能有一些关于我刚刚运行的分析的不同方面的长XML文档,我希望一些特定的元素,如"磁盘"或"专有Foo服务"有一个特殊的模板,因为它应该很好地显示,而其他的东西只是得到一个通用的模板。

我想过使用DataTemplateSelector,但似乎必须有一个更好的方法。我甚至不确定如何为XML做到这一点。你们这些更聪明的人有什么智慧可以传授吗,还是我在纠结如何针对XML编写DataTemplateSelector ?

覆盖数据绑定(XML/XPath) TreeView中特定节点的默认模板

DataTemplateHierarchicalDataTemplate也具有DataType属性。当您删除x:Key并提供DataType时,这些模板是隐式的。因此,您可以将不同的模板定义为隐式的,并且它们将自动使用,只要您不在初始TreeView上提供ItemTemplateItemTemplateSelector

<HierachicalDataTemplate DataType="{x:Type ProprietaryFooService}">

我个人尽量避免这种情况,因为这也意味着其他可以显示数据的控件也在使用这些模板。在我看来,最好是使用DataTemplateSelector,特别是当你处理相同的类型时,你需要以不同的方式显示。

编辑:

对不起,我没有注意到您正在使用Xpath。我想在那里行不通。我将把这个答案留在这里,但不能保证它符合您的需要。