共用方式為


相依性屬性

注意

此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面上的某些資訊可能已過期。

相依性屬性 (DP) 是一般屬性,例如此屬性會將其值儲存在屬性存放區中,而不是儲存在類型變數 (欄位)。

附加的相依性屬性是一種相依性屬性,其模型化為靜態 Get 和 Set 方法,代表物件與其容器之間的關聯性 (例如,Button 物件在 Panel 容器上的位置)。

✔️ 如果您需要屬性來支援 WPF 功能,例如樣式、觸發程式、資料系結、動畫、動態資源和繼承,請提供相依性屬性。

相依性屬性設計

✔️ 實作相依性屬性時,自 DependencyObject 或其子類型之一進行繼承。 此類型提供非常有效率的屬性存放區實作,並自動支援 WPF 資料系結。

✔️ 提供一般 CLR 屬性和公用靜態唯讀欄位,以儲存每個相依性屬性的 System.Windows.DependencyProperty 執行個體。

✔️ 藉由呼叫執行個體方法 DependencyObject.GetValueDependencyObject.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 節錄。

另請參閱