方法 : 依存関係プロパティのメタデータをオーバーライドする

この例では、継承したクラスの既定の依存関係プロパティのメタデータを、OverrideMetadata メソッドを呼び出して型固有のメタデータを提供することで、オーバーライドする方法を示します。

使用例

PropertyMetadata を定義することにより、クラスで依存関係プロパティの動作 (既定値、プロパティ システム コールバックなど) を定義できます。 多くの依存関係プロパティ クラスで、登録プロセスの一部として既定のメタデータが既に確立されています。 これには、WPF API の一部である依存関係プロパティが含まれます。 クラス継承により依存関係プロパティを継承するクラスは、メタデータで変更できるプロパティの特性がサブクラス固有の要件に合致するように、元のメタデータをオーバーライドできます。

依存関係プロパティでのメタデータのオーバーライドは、そのプロパティがプロパティ システムによって使用される (プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化されるタイミングに相当) 前に実行する必要があります。 OverrideMetadata の呼び出しは、自身を OverrideMetadata の forType パラメーターとして提供する型の静的なコンストラクター内で実行される必要があります。 所有者型のインスタンスが存在する場合にメタデータを変更しようとすると、例外は発生しませんが、プロパティ システムに不整合な動作が発生します。 また、メタデータは 1 つの型につき 1 回しかオーバーライドできません。 それ以降に同じ型のメタデータをオーバーライドしようとすると、例外が発生します。

次の例では、MyAdvancedStateControl カスタム クラスが、MyAdvancedStateControl によって StateProperty に提供されるメタデータを、新しいプロパティ メタデータでオーバーライドします。 たとえば、新しく構築された MyAdvancedStateControl インスタンスでプロパティが照会されると、StateProperty の既定値は true となります。

  Public Class MyStateControl
      Inherits ButtonBase
    Public Sub New()
        MyBase.New()
    End Sub
    Public Property State() As Boolean
      Get
          Return CType(Me.GetValue(StateProperty), Boolean)
      End Get
      Set(ByVal value As Boolean)
          Me.SetValue(StateProperty, value)
      End Set
    End Property
    Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
  End Class


...


  Public Class MyAdvancedStateControl
      Inherits MyStateControl
    Public Sub New()
        MyBase.New()
    End Sub
    Shared Sub New()
      MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
    End Sub
  End Class
public class MyStateControl : ButtonBase
{
  public MyStateControl() : base() { }
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); } 
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}


...


public class MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}

参照

参照

DependencyProperty

概念

依存関係プロパティの概要

カスタム依存関係プロパティ

その他の技術情報

プロパティに関する「方法」トピック