2011-04-27 15 views
2

我試圖創建從TreeView控件繼承,並使用TreeViewItems作爲該項目的容器自定義PropertyGrid控件不同的主題。另外,我想根據TreeViewItem綁定的對象的類型爲TreeViewItems設置控件模板。我希望通過設置ItemsSource來填充PropertyGrid。主題WPF TreeViewItems不同的控制模板

目前我通過經由HierarchialDataTemplate設置TreeViewItems.ItemContainerStyleSelector應用基於綁定對象的類型不同的控制模板。在這個樣式選擇器中,我通過資源鍵返回靜態資源。我不想使用此選擇器和資源鍵方法,而是根據要綁定到的對象的類型創建不同的派生TreeViewItem對象。這將允許我根據類型爲每個主題應用不同的風格,與其他控件的主題相同。但是我沒有辦法做到這一點。重寫ItemsControl.GetContainerForItemOverride會做我想要的,如果它傳遞了綁定到的對象,或者至少是它的類型,但我沒有看到一種方法來使這個工作。任何想法如何做到這一點?或者,我是否在談論他的全部錯誤?

回答

1

你最好的選擇將是隻讀的自定義依賴屬性添加到您的自定義樹型視圖。由於缺乏更好的名字,我們稱之爲「Look」。這個屬性然後可以是一個枚舉你想要應用的各種外觀或樣式。

然後,您可以創建自定義的樹型視圖,它使用樣式觸發基於你的樣子屬性來更改模板或其他各種性質的單一風格。

然後,您可以設置在PrepareContainerForItemOverride你看屬性,根據所給出的項目。

ItemsControl的一般期望他們的「容器」是一個單一類型的,但這不是嚴格執行。但正如你所說,你不能根據包裝物品來創建不同的容器。

此外,虛擬化增加了混合的一些複雜性。在這種情況下,容器可能會被重複使用,因此您無法「創建」新的屬性類型。但是,即使啓用了虛擬化,PrepareContainerForItemOverride也會被調用。

+0

這聽起來不錯。我會試一試並回報。 – Hank 2011-04-29 19:10:18

+0

這個伎倆。謝謝一堆! – Hank 2011-05-03 22:56:13