2011-09-26 71 views
1

TL; DR预先:我想为除WPF TreeView中特定几个节点以外的所有节点使用“默认”HierarchicalDataTemplate。这些节点来自XMLDocument,并且直到运行时才完全知道。有没有办法做到这一点?覆盖数据绑定中特定节点的默认模板(XML/XPath)TreeView

在运行时,我分析系统的特定部分,并建立一个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文档,我希望像“Disk”或“Proprietary Foo Service”这样的特定元素拥有一个特殊的模板,因为它应该很好地显示,而其他所有内容都会得到一个通用的模板。

我想过使用DataTemplateSelector,但它似乎必须有更好的方法。我甚至不知道如何为XML做这件事。你们中的任何一个聪明人都有什么智慧可以传授吗?或者我想知道如何写一个DataTemplateSelector对抗XML?

回答

1

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

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

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

编辑: 对不起,我错过了你正在使用Xpath。我想它不会在那里工作。我会在这里留下这个答案,但不能保证它适合您的需求。无论如何,它可能有其他帮助。

+0

嗯...如果你有比我更好的方式,我绝对有兴趣看到它。我新来绑定到XML。 – djdanlib

+0

我决定使用DataTemplateSelector。我会将你的答案标记为已接受。 – djdanlib