2012-07-30 63 views
3

我正在設計一個用戶控件,我想讓它的行爲是可配置的 - 但只有一次,當它被創建時。我不需要它以後再適應,因爲我事先知道一個特定的窗口將使用它與一個特定的配置。WPF UserControl預配置

考慮這個簡單的標記:

<MyControl SomeProperty="True" SomeOtherProperty="12345" /> 

SomePropertySomeOtherProperty在我隱藏聲明DependencyProperties。

問題是:在調用InitializeComponent()之前,控件會在其構造函數中對其輸入數據進行一些預處理。在那個階段,我沒有訪問由用戶定義的SomePropertySomeOtherProperty - 他們仍然有默認值。

之後,如果在XAML中設置了這些屬性,則會在構造函數之後爲它們分配值。我可以通過引入PropertyChangedCallback來回應他們,並在每個屬性更新後再次執行計算。

這是次優的,因爲我只是想通過值一次並確保控件的初始化邏輯只運行一次 - 已經具有正確的設置。具有PropertyChangedCallback的解決方案需要我使得該控制更復雜,即響應於在控制的整個生命週期期間對這些依賴屬性的任何更改。這比我需要的要多得多 - 我的屬性在控件創建時只能讀取一次,並且只設置一次,這會令人滿意。

如何在保持XAML標記清潔的同時做到這一點?

回答

2

爲了讓WPF設置屬性,必須構建您的控件 - 在設置屬性之後,無法「延遲」構造。

除了在構造函數中放入初始化邏輯外,您可能還想嘗試將它放在其他位置,例如訂閱Loaded event並在那裏初始化。這會在設置屬性後發生。

+0

謝謝!有沒有辦法讓我清楚地指出這些屬性只能在初始化時設置,就像從常規對象的構造函數參數中設置'readonly'字段一樣?我看過'FrameworkPropertyMetadata.IsNotDataBindable',但這可能是不夠的。 – Kos 2012-07-31 18:13:24

+0

@Kos不是真的,因爲你在「初始化」之後設置它們(技術上)。這就是說,你不需要讓它們的值在設置後真正改變。如果整個對象以這種方式工作,則可以讓您的類從Freezable派生,並「凍結」它(請參閱:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx) – 2012-07-31 18:22:53