主题WPF TreeViewItems具有不同的控件模板

时间:2011-04-27 23:56:04

标签: wpf treeview wpf-controls treeviewitem

我正在尝试为从TreeView继承的自定义PropertyGrid控件创建不同的主题,并使用TreeViewItems作为项容器。另外,我想根据TreeViewItem绑定的对象类型为TreeViewItems设置控件模板。我更喜欢通过设置ItemsSource来填充PropertyGrid。

目前,我通过HierarchialDataTemplate设置TreeViewItems.ItemContainerStyleSelector,根据绑定对象的类型应用不同的控件模板。在这个样式选择器中,我通过资源键返回一个静态资源。我想不使用此选择器和资源键方法,而是根据要绑定的对象的类型创建不同的派生TreeViewItem对象。这将允许我基于类型应用每个主题的不同样式,与其他控件的主题相同。但我没有办法做到这一点。覆盖ItemsControl.GetContainerForItemOverride会做我想要的,如果它传递了要绑定的对象,或者至少它的类型,但我没有看到一种方法来使这工作。关于如何做到这一点的任何想法?或者,我是不是他的错?

1 个答案:

答案 0 :(得分:1)

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

然后,您可以为自定义TreeViewItem创建一个Style,它使用基于Look属性的Style Triggers来更改Template或其他各种属性。

然后,您可以根据给定的项目在PrepareContainerForItemOverride中设置Look属性。

ItemsControl一般期望他们的“容器”是单一类型,但这并没有严格执行。但正如您所说,您无法根据包装的项目创建不同的容器。

此外,虚拟化为混合增加了一些复杂性。在这种情况下,容器可能会被重用,因此您将无法“创建”新属性类型。但是,即使启用了虚拟化,也会调用PrepareContainerForItemOverride。