您好我使用的是IFooNode接口,它是树的一部分 我想使用HierarchicalDataTemplate在TreeView中显示这个树。 然而,由于界面,这不起作用。 我看到两种方式,我称之为“不错”
找出真正实现IFooNode的类型(让我们称之为FooNode ...),然后找到定义FooNode的程序集,添加对该程序集的引用并为FooNode创建HierarchicalDataTemplate(希望实现类永远不会更改)。 ..)
编写一个包装IFooNode的MyCoolIFooNodeWrapperForWpf类,不绑定到树,但从树根填充MyCoolIFooNodeWrapperForWpf列表,并为MyCoolIFooNodeWrapperForWpf创建HierarchicalDataTemplate。
我可以以某种方式始终应用HierarchicalDataTemplate,无论数据类型是什么(我认为这将是较小的邪恶......)
还有其他想法吗?
答案 0 :(得分:2)
您可以使用ItemTemplateSelector。在选择器的代码中,您可以检查数据对象实现的接口,并为此项选择适当的DataTemplate / HeirarchicalDataTemplate。
选择器既可以应用于容器本身(ItemsControl.ItemTemplateSelector),也可以应用于分层数据模板(HeirarchicalDataTemplate.ItemTemplateSelector)。
我认为这是较小的罪恶。
答案 1 :(得分:0)
如果您没有从多个模板中进行选择,则无需在模板上指定数据类型。如果树中的所有对象都实现了您的界面,只需使用该界面的属性粘贴到模板中,就可以了。您无需在模板中执行任何操作即可使其特定于该接口。
如果由于某种原因,您需要根据对象支持的接口进行模板选择,则需要实现模板选择器,并处理阻止WPF内置模板选择机制的多对一问题从一开始就使用接口。 (也就是说,如果您有IFoo
的模板和IBar
的模板,那么您使用哪个模板来支持IFoo
和 {{1 }}?)