2

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

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

4

1 回答 1

1

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

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

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

ItemsControl 通常期望它们的“容器”是单一类型的,但这并不是严格执行的。但正如你所说,你不能根据它包装的物品创建不同的容器。

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

于 2011-04-28T00:24:28.040 回答