相依性屬性
注意
此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面上的某些資訊可能已過期。
相依性屬性 (DP) 是一般屬性,例如此屬性會將其值儲存在屬性存放區中,而不是儲存在類型變數 (欄位)。
附加的相依性屬性是一種相依性屬性,其模型化為靜態 Get 和 Set 方法,代表物件與其容器之間的關聯性 (例如,Button
物件在 Panel
容器上的位置)。
✔️ 如果您需要屬性來支援 WPF 功能,例如樣式、觸發程式、資料系結、動畫、動態資源和繼承,請提供相依性屬性。
相依性屬性設計
✔️ 實作相依性屬性時,自 DependencyObject 或其子類型之一進行繼承。 此類型提供非常有效率的屬性存放區實作,並自動支援 WPF 資料系結。
✔️ 提供一般 CLR 屬性和公用靜態唯讀欄位,以儲存每個相依性屬性的 System.Windows.DependencyProperty 執行個體。
✔️ 藉由呼叫執行個體方法 DependencyObject.GetValue 和 DependencyObject.SetValue 來實作相依性屬性。
✔️ 用屬性的名稱尾碼為「Property」來命名相依性屬性靜態欄位。
❌ 請勿在程式碼中明確設定相依性屬性的預設值;請改為在中繼資料中進行設定。
如果您明確設定屬性預設值,可能會防止該屬性透過某些隱含方式設定,例如樣式。
❌ 請勿將程式碼放在標準程式碼以外的屬性存取子中,以存取靜態欄位。
如果屬性是以隱含方式設定,例如樣式,則不會執行該程式碼,因為樣式會直接使用靜態欄位。
❌ 請勿使用相依性屬性來儲存安全的資料。 甚至私人相依性屬性也可以公開存取。
附加的相依性屬性設計
上一節所述的相依性屬性代表宣告類型的內建屬性;例如 Text
屬性是 TextButton
的屬性,此屬性會進行宣告。 其中一種特殊類型的相依性屬性是附加的相依性屬性。
附加屬性的典型範例是 Grid.Column 屬性。 屬性代表按鈕 (而非格線) 的欄位置,但只有在按鈕包含在格線中時才會相關,因此此屬性會「附加」至格線的按鈕。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0">Click</Button>
<Button Grid.Column="1">Clack</Button>
</Grid>
附加屬性的定義看起來與一般相依性屬性的定義大致類似,不同之處在於存取子是由靜態 Get 和 Set 方法所表示:
public class Grid {
public static int GetColumn(DependencyObject obj) {
return (int)obj.GetValue(ColumnProperty);
}
public static void SetColumn(DependencyObject obj, int value) {
obj.SetValue(ColumnProperty,value);
}
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid)
);
}
相依性屬性驗證
屬性通常會實作稱為驗證的內容。 驗證邏輯會在嘗試變更屬性值時執行。
但很不幸的是,相依性屬性存取子不能包含任意驗證程式代碼。 而是必須在屬性註冊期間指定相依性屬性驗證邏輯。
❌ 請勿將相依性屬性驗證邏輯放在屬性的存取子中。 請改為將驗證回呼傳遞至 DependencyProperty.Register
方法。
相依性屬性變更告知
❌ 請勿在相依性屬性存取子中實作變更通知邏輯。 相依性屬性具有內建的變更通知功能,必須藉由提供變更通知回呼給 PropertyMetadata 來使用。
相依性屬性值強制型轉
在實際修改屬性存放區之前,setter 修改提供給屬性 setter 的值時,就會發生屬性強制型轉。
❌ 請勿在相依性屬性存取子中實作強制型轉邏輯。
相依性屬性具有內建強制型轉功能,而且可以藉由向 PropertyMetadata
提供強制型轉回呼來使用。
Portions © 2005, 2009 Microsoft Corporation. 著作權所有,並保留一切權利。
獲 Pearson Education, Inc. 的授權再版,從 Krzysztof Cwalina 和 Brad Abrams 撰寫,並在 2008 年 10 月 22 日由 Addison-Wesley Professional 出版,作為 Microsoft Windows Development Series 一部份的 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 節錄。