方法 : 依存関係プロパティのメタデータをオーバーライドする
更新 : 2007 年 11 月
この例では、継承したクラスの既定の依存関係プロパティのメタデータを、OverrideMetadata メソッドを呼び出して型固有のメタデータを提供することで、オーバーライドする方法を示します。
使用例
PropertyMetadata を定義することにより、クラスで依存関係プロパティの動作 (既定値、プロパティ システム コールバックなど) を定義できます。多くの依存関係プロパティ クラスで、登録プロセスの一部として既定のメタデータが既に確立されています。これには、WPF API の一部である依存関係プロパティが含まれます。クラス継承により依存関係プロパティを継承するクラスは、メタデータで変更できるプロパティの特性がサブクラス固有の要件に合致するように、元のメタデータをオーバーライドできます。
依存関係プロパティでのメタデータのオーバーライドは、そのプロパティがプロパティ システムによって使用される (プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化されるタイミングに相当) 前に実行する必要があります。OverrideMetadata の呼び出しは、自身を OverrideMetadata の forType パラメータとして提供する型の静的なコンストラクタ内で実行される必要があります。所有者型のインスタンスが存在する場合にメタデータを変更しようとすると、例外は発生しませんが、プロパティ システムに不整合な動作が発生します。また、メタデータは 1 つの型につき 1 回しかオーバーライドできません。それ以降に同じ型のメタデータをオーバーライドしようとすると、例外が発生します。
次の例では、MyAdvancedStateControl カスタム クラスが、MyAdvancedStateControl によって 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 MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}