依存関係プロパティを実装する方法 (WPF .NET)

この記事では、DependencyProperty フィールドを使用して共通言語ランタイム (CLR) プロパティを補足することにより、依存関係プロパティを実装する方法について説明します。 依存関係プロパティでは、いくつかの高度な Windows Presentation Foundation (WPF) プロパティ システム機能がサポートされています。 これらの機能には、スタイル、データ バインディング、継承、アニメーション、既定値が含まれます。 これらの機能をサポートするために定義するプロパティが必要な場合は、使用するプロパティを依存関係プロパティとして実装してください。

重要

.NET 7 と .NET 6 用のデスクトップ ガイド ドキュメントは作成中です。

次の例では、Register メソッドを呼び出して依存関係プロパティを登録する方法を示します。 Register メソッドからは、"依存関係プロパティ識別子" と呼ばれる DependencyProperty インスタンスが返されます。 この識別子は static readonly フィールドに格納され、依存関係プロパティの名前と特性を保持します。

識別子フィールドには、名前付け規則 <property name>Property を適用する必要があります。 たとえば、依存関係プロパティを Location という名前で登録する場合、識別子フィールドには LocationProperty という名前を付ける必要があります。 このパターンに従って名前が付けられていない場合は、定義したプロパティが WPF デザイナーから正しく報告されず、プロパティ システムのスタイル適用の一部が予期したとおりに動作しなくなる可能性があります。

次の例では、依存関係プロパティとその CLR アクセサーの名前HasFish であるため、識別子フィールドには HasFishProperty という名前が付けられます。 依存関係プロパティの型は Boolean です。依存関係プロパティを登録する所有者の種類は Aquarium です。

依存関係プロパティには既定のメタデータを指定することができます。 この例では、HasFish 依存関係プロパティの既定値を false に設定します。

public class Aquarium : DependencyObject
{
    public static readonly DependencyProperty HasFishProperty =
        DependencyProperty.Register(
            name: "HasFish",
            propertyType: typeof(bool),
            ownerType: typeof(Aquarium),
            typeMetadata: new FrameworkPropertyMetadata(defaultValue: false));

    public bool HasFish
    {
        get => (bool)GetValue(HasFishProperty);
        set => SetValue(HasFishProperty, value);
    }
}
Public Class Aquarium
    Inherits DependencyObject

    Public Shared ReadOnly HasFishProperty As DependencyProperty =
    DependencyProperty.Register(
        name:="HasFish",
        propertyType:=GetType(Boolean),
        ownerType:=GetType(Aquarium),
        typeMetadata:=New FrameworkPropertyMetadata(defaultValue:=False))

    Public Property HasFish As Boolean
        Get
            Return GetValue(HasFishProperty)
        End Get
        Set(value As Boolean)
            SetValue(HasFishProperty, value)
        End Set
    End Property

End Class

単にプライベート フィールドを使用して CLR プロパティを補足するのではなく依存関係プロパティを実装する理由とその方法の詳細については、依存関係プロパティの概要に関するページを参照してください。

関連項目