次の方法で共有


依存関係プロパティ

このコンテンツは、 フレームワーク設計ガイドライン (再利用可能な .NET ライブラリの規則、イディオム、パターン、第 2 版) から、Pearson Education, Inc. のアクセス許可によって再印刷されます。 そのエディションは2008年に出版され、その後 、本は第3版で完全に改訂されています。 このページの情報の一部が古くなっている可能性があります。

依存関係プロパティ (DP) は、たとえば、型変数 (フィールド) に格納するのではなく、プロパティ ストアにその値を格納する通常のプロパティです。

アタッチされた依存関係プロパティは、オブジェクトとそのコンテナー間のリレーションシップ (たとえば、Button コンテナーでのPanel オブジェクトの位置) を記述する "プロパティ" を表す静的な Get メソッドおよび Set メソッドとしてモデル化された依存関係プロパティの一種です。

✔️ スタイル、トリガー、データ バインディング、アニメーション、動的リソース、継承などの WPF 機能をサポートするためのプロパティが必要な場合は、依存関係プロパティを指定してください。

依存関係プロパティの設計

✔️ 依存関係プロパティを実装するときに、 DependencyObjectまたはそのサブタイプの 1 つを継承します。 この型は、プロパティ ストアの非常に効率的な実装を提供し、WPF データ バインディングを自動的にサポートします。

✔️ 各依存関係プロパティに対して、 System.Windows.DependencyProperty のインスタンスを格納する通常の CLR プロパティとパブリック静的読み取り専用フィールドを指定します。

✔️ 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に変更通知コールバックを指定することによって使用する必要がある変更通知機能が組み込まれています。

依存関係プロパティの値の強制

プロパティの強制は、プロパティ ストアが実際に変更される前に、プロパティ セッターに指定された値がセッターによって変更されたときに行われます。

❌ 依存関係プロパティ アクセサーに強制型化ロジックを実装しないでください。

依存関係プロパティには強制型変換機能が組み込まれており、 PropertyMetadataに強制型変換コールバックを指定することで使用できます。

Portions © 2005, 2009 Microsoft Corporation. 無断転載を禁じます。

フレームワーク設計ガイドライン:再利用可能な .NET ライブラリの規則、イディオム、パターン、Krzysztof Cwalina および Brad Abrams による第 2 版は、2008 年 10 月 22 日に Microsoft Windows 開発シリーズの一部として Addison-Wesley Professional によって公開されました。

こちらも参照ください