方法: 依存関係プロパティのメタデータをオーバーライドするHow to: Override Metadata for a Dependency Property

この例は、呼び出すことによって、継承されたクラスからは既定の依存関係プロパティ メタデータをオーバーライドする方法を示します、OverrideMetadataメソッドと型固有のメタデータを提供します。This example shows how to override default dependency property metadata that comes from an inherited class, by calling the OverrideMetadata method and providing type-specific metadata.

Example

定義することでそのPropertyMetadataクラスの既定値とプロパティ システム コールバックなどの依存関係プロパティの動作を定義できます。By defining its PropertyMetadata, a class can define the dependency property's behaviors, such as its default value and property system callbacks. 多くの依存関係プロパティ クラスで、登録プロセスの一部として既定のメタデータが既に確立されています。Many dependency property classes already have default metadata established as part of their registration process. 一部である依存関係プロパティが含まれます、 WPFWPF API。This includes the dependency properties that are part of the WPFWPF API. クラス継承により依存関係プロパティを継承するクラスは、メタデータで変更できるプロパティの特性がサブクラス固有の要件に合致するように、元のメタデータをオーバーライドできます。A class that inherits the dependency property through its class inheritance can override the original metadata so that the characteristics of the property that can be altered through metadata will match any subclass-specific requirements.

依存関係プロパティでのメタデータのオーバーライドは、そのプロパティがプロパティ システムによって使用される (プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化されるタイミングに相当) 前に実行する必要があります。Overriding metadata on a dependency property must be done prior to that property being placed in use by the property system (this equates to the time that specific instances of objects that register the property are instantiated). 呼び出すOverrideMetadataとして自体を提供する型の静的コンス トラクター内で実行する必要があります、forTypeパラメーターのOverrideMetadataします。Calls to OverrideMetadata must be performed within the static constructors of the type that provides itself as the forType parameter of OverrideMetadata. 所有者型のインスタンスが存在する場合にメタデータを変更しようとすると、例外は発生しませんが、プロパティ システムに不整合な動作が発生します。If you attempt to change metadata once instances of the owner type exist, this will not raise exceptions, but will result in inconsistent behaviors in the property system. また、メタデータは 1 つの型につき 1 回しかオーバーライドできません。Also, metadata can only be overridden once per type. それ以降に同じ型のメタデータをオーバーライドしようとすると、例外が発生します。Subsequent attempts to override metadata on the same type will raise an exception.

次の例では、MyAdvancedStateControl カスタム クラスが、MyAdvancedStateControl によって StateProperty に提供されるメタデータを、新しいプロパティ メタデータでオーバーライドします。In the following example, the custom class MyAdvancedStateControl overrides the metadata provided for StateProperty by MyAdvancedStateControl with new property metadata. たとえば、新しく構築された MyAdvancedStateControl インスタンスでプロパティが照会されると、StateProperty の既定値は true となります。For instance, the default value of the StateProperty is now true when the property is queried on a newly constructed MyAdvancedStateControl instance.

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

関連項目See also