具有不同控件模板的主题WPF树视图项

具有不同控件模板的主题WPF树视图项,wpf,treeview,wpf-controls,treeviewitem,Wpf,Treeview,Wpf Controls,Treeviewitem,我正在尝试为从TreeView继承的自定义PropertyGrid控件创建不同的主题,并使用TreeView项作为项目容器。此外,我想根据TreeViewItem绑定到的对象类型设置TreeViewItem的控件模板。我希望通过设置ItemsSource来填充PropertyGrid,就像现在一样 目前,我通过HierarchyalDataTemplate设置TreeViewItems.ItemContainerStyleSelector,根据绑定对象的类型应用不同的控件模板。在这个样式选择器中

我正在尝试为从TreeView继承的自定义PropertyGrid控件创建不同的主题,并使用TreeView项作为项目容器。此外,我想根据TreeViewItem绑定到的对象类型设置TreeViewItem的控件模板。我希望通过设置ItemsSource来填充PropertyGrid,就像现在一样


目前,我通过HierarchyalDataTemplate设置TreeViewItems.ItemContainerStyleSelector,根据绑定对象的类型应用不同的控件模板。在这个样式选择器中,我通过一个资源键返回一个静态资源。我不想使用这个选择器和资源键方法,而是根据要绑定到的对象的类型创建不同的派生TreeViewItem对象。这将允许我根据类型为每个主题应用不同的样式,与其他控件设置主题的方式相同。但我看不出有什么办法。如果向override ItemsControl.GetContainerForItemOverride传递了要绑定的对象,或者至少传递了它的类型,那么override ItemsControl.GetContainerForItemOverride将执行我想要的操作,但我看不到实现这一点的方法。有什么办法吗?或者,我是不是完全错了?

您最好的选择是将只读自定义依赖项属性添加到您的自定义TreeItem中。由于没有更好的名称,我们称之为“外观”。然后,此属性可以是具有要应用的各种外观或样式的枚举

然后,您可以为自定义TreeViewItem创建单个样式,该样式使用基于Look属性的样式触发器来更改模板或其他各种属性

然后,可以基于给定的项在中设置Look属性

ItemsControl通常期望其“容器”为单一类型,但这并不是严格强制的。但正如您所说,您不能根据包装的物品创建不同的容器

此外,虚拟化还增加了一些复杂性。在这种情况下,可以重用容器,这样您就没有机会“创建”属性类型的新容器。但是,即使启用了虚拟化,也会调用PrepareContainerForItemOverride