次の方法で共有


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

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

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

依存関係プロパティのメタデータのオーバーライドは、そのプロパティがプロパティ システムによって使用される前に行う必要があります (これは、プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化される時間と同じになります)。 OverrideMetadata の呼び出しは、OverrideMetadataforType パラメーターとしてそれ自体を提供する型の静的コンストラクター内で実行する必要があります。 所有者型のインスタンスが存在する場合にメタデータを変更しようとすると、例外は発生しませんが、プロパティ システムの動作が一貫性がなくなります。 また、メタデータは型ごとに 1 回だけオーバーライドできます。 その後、同じ型のメタデータをオーバーライドしようとすると、例外が発生します。

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

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 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 : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}
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

関連項目