2010-11-28 48 views
0

有沒有辦法將參數傳遞給資源字典?我認爲我可以附加一個代碼來指定事件處理程序,但不幸的是,我還需要從事件處理程序訪問父控件的引用。我相信可以通過爲xaml中的資源字典指定一個x:Class屬性,然後在同一個文件夾中創建一個類,其文件名類似[資源字典名稱] .xaml.cs之類來附加代碼隱藏。Wpf:將參數傳遞給ResourceDictionary

其目的是爲我在單個樹視圖控件中使用的四個分層數據模板分離代碼。樹視圖的xaml看起來有點長和難看,所以我希望將它分解成四個資源字典。任何想法都歡迎!

安德魯

回答

0

資源字典聽起來像一個有點奇怪的方式來做到這一點。資源字典都是關於共享實例 - 它們讓你可以在多個地方使用一個實例(例如風格,模板,畫筆或其他)。它們並不是真正的用於分割用戶界面以簡化各個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}}" /> 

但坦率地說,當我發現自己在我需要這個職位的時候,我問自己:我如何讓自己進入一個看起來有必要的位置,我能做些什麼來解決這個問題?

+0

謝謝伊恩,這是一個很棒的答案。我在代碼隱藏方面遇到很多麻煩的原因是因爲拖放功能。每個分層數據模板都有一個可以拖動到樹中另一個項目的堆棧面板。我必須努力實現這一點,然後才能正確回答答案,但我會回來的。對於我來說,要想得出這些結論將會一直持續下去!很好的答案! – Andrew 2010-11-28 15:09:24

1

你知道你可以merge your Resource Dictionaries然後引用DataTemplate根據需要TreeView內的字典中。

+0

請注意,密鑰不能在單個ResourceDictionary中複製。所以你不能在兩個資源詞典中使用同一個鍵的風格,這些資源合併成一個更大的資源字典。沒有真正的相關性,但值得一提。 – basarat 2010-11-28 14:33:30