資源字典聽起來像一個有點奇怪的方式來做到這一點。資源字典都是關於共享實例 - 它們讓你可以在多個地方使用一個實例(例如風格,模板,畫筆或其他)。它們並不是真正的用於分割用戶界面以簡化各個Xaml文件的機制。
將過度複雜的Xaml文件分割成幾個更易於管理的小文件的通常機制是用戶控制。 (資源字典合併當你已經有一個資源字典時就會起作用,並且它太大了,但是你通常不會引入一個資源字典來開始分解東西,相反,資源字典傾向於鼓勵過度大的Xaml文件,這就是爲什麼字典合併必須首先發明的原因!)
大多數情況下,當我定義數據模板時,我將它僅包含一個用戶控件。如果這變得更加複雜,我會將該用戶控件分成更多的用戶控件。
從您的描述來看,這聽起來像您的Xaml文件變得很大,因爲您已經有四個大型的分層數據模板。如果你把每個模板的身體,把它變成一個用戶控件,你的4個模板現在將變得非常簡單 - 是這樣的:
<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}">
<loc:TreeItemTypeOne />
</HierarchicalDataTemplate>
和你最有可能不再需要把這些模板爲單獨的文件。但是,因爲每個模板的內容現在都在用戶控件中,所以可以讓您放置代碼。
您提到需要對父控件的引用。這讓我很擔心 - 這聽起來像是你的代碼隱藏了太多的代碼。但有一件事的時候,你可以通過定義用戶控件調用ParentControl依賴屬性解決這個問題,然後把這個模板:
<loc:TreeItemTypeOne
ParentControl="{Binding RelativeSource=
{RelativeSource AncestorType=loc:ParentControlType}}" />
但坦率地說,當我發現自己在我需要這個職位的時候,我問自己:我如何讓自己進入一個看起來有必要的位置,我能做些什麼來解決這個問題?
謝謝伊恩,這是一個很棒的答案。我在代碼隱藏方面遇到很多麻煩的原因是因爲拖放功能。每個分層數據模板都有一個可以拖動到樹中另一個項目的堆棧面板。我必須努力實現這一點,然後才能正確回答答案,但我會回來的。對於我來說,要想得出這些結論將會一直持續下去!很好的答案! – Andrew 2010-11-28 15:09:24