WPF でカスタムコントロールを作っていると、基本クラスで定義されているプロパティのデフォルト値を変更したり、プロパティの値の変更に対して処理を行いたい場合があります。
しかし、WPF の依存関係プロパティは virtual ではないので、オーバーライドできません。
この記事では、「どうすればいいのか?」を解説していきます。
どうすればいいのか?
依存関係プロパティをオーバーライドするには、DependencyProperty の OverrideMetadata メソッドを使えば可能です。
public partial class SampleControl : UserControl
{
// コンストラクタ
public SampleControl()
{
InitializeComponent();
}
// staticコンストラクタ
static SampleControl()
{
SampleControl.BackgroundProperty.OverrideMetadata(
typeof(SampleControl),
new FrameworkPropertyMetadata(BackgroundChanged));
}
static void BackgroundChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
// UserControl の Background が変更されたら、
// 中に置かれている TextBox の Background も変更する。
SampleControl control = (SampleControl)obj;
control._textBox.Background = (Brush)e.NewValue;
}
}
カスタムコントロールの static コンストラクタ内で、オーバーライドしたいプロパティのOverrideMetadata メソッドに、クラスの型と FrameworkPropertyMetadata を渡しています。
FrameworkPropertyMetadata では、プロパティ変更時に実行されるコールバックメソッドを指定しています。他にも、デフォルト値や、プロパティ変更時に値を検証するメソッドも指定できます。
コメント