9

MyComponent というクラスがあり、BackgroundProperty という名前の DependencyProperty があります。

public class MyComponent
{
    public MyBackground Background
    {
        get { return (MyBackground)GetValue(BackgroundProperty); }
        set { SetValue(BackgroundProperty, value); }
    }
    public static readonly DependencyProperty BackgroundProperty =
        DependencyProperty.Register("Background", typeof(MyBackground),
            typeof(MyComponent), new FrameworkPropertyMetadata(default(MyBackground), new PropertyChangedCallback(OnPropertyChanged)));
}

MyBackground は DependencyObject から派生したクラスで、いくつかの DependencyProperties を持っています。

public class MyBackground : DependencyObject
{
    public Color BaseColor
    {
        set { SetValue(BaseColorProperty, value); }
        get { return (Color)GetValue(BaseColorProperty); }
    }
    public static readonly DependencyProperty BaseColorProperty =
        DependencyProperty.Register("BaseColor", typeof(Color),
            typeof(MyBackground ), new UIPropertyMetadata(Colors.White));

    [...]
}

ここで、MyBackground のプロパティが変更されたときに、MyComponent に MyBackground が変更されたことを通知し、OnPropertyChanged という名前の PropertyChangedCallback を呼び出す必要があります。

4

4 に答える 4

3

あなたが説明したことを行う1つの方法は、DependencyObjectの代わりにFreezableから派生することです。Freezable のプロパティが変更されると、その Freezable を参照する DO の PropertyChangedCallback が呼び出されるため、MyComponent の Background プロパティのコールバックが呼び出されます。その場合、e.OldValue と e.NewValue は同じ参照になります。内部的には、WPF はイベント引数に、それがサブオブジェクトの変更であることを示すフラグを持っています。

これは、SolidColorBrush の Color プロパティが変更された場合に要素を無効にできるように、ブラシなどに対してフレームワークが行うことです。オブジェクトが決して変更されない場合 (またはスレッドセーフにしたい場合) は、オブジェクトをフリーズできます (つまり、不変にすることができます)。

ところで、プロパティの名前として Background を使用することはおそらく避けたいと思います。フレームワークがいくつかの要素 (コントロール、ボーダーなど) の名前付きプロパティに使用するものであるため、ほとんどの開発者は、それが Brush 型であると想定します。

于 2013-10-17T16:34:18.620 に答える
2

DependencyPropertyDescriptor と AddValueChanged を使用したいようです。

これに関する記事は次のとおりです。 http://www.codeproject.com/Articles/34741/Change-Notification-for-Dependency-Properties.aspx

..そしておそらくより良い実装: http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/

于 2010-07-29T23:17:09.203 に答える