web-dev-qa-db-ja.com

DependencyPropertyの変更されたイベントをリッスンし、古い値を取得します

VisiblePositionクラスのColumnプロパティのプロパティ変更イベントをサブスクライブする次のコードがあります。

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ColumnBase.VisiblePositionProperty, typeof(Column));

if (dpd != null)
{
   dpd.AddValueChanged(col, ColumnVisiblePositionChangedHandler);
}

ColumnVisiblePositionChangedHandlerメソッドの定義は次のとおりです。

static internal void ColumnVisiblePositionChangedHandler(object sender, EventArgs e)

問題は、プロパティの古い値を取得する必要があることです。それ、どうやったら出来るの?

ありがとう、

18
sean717

残念ながら、この方法でプロパティ変更イベントハンドラーを登録すると、古い値の情報を取得できません。

回避策の1つは、プロパティ値をどこかに格納し(これは「古い」値です)、イベントハンドラーで現在の値と比較することです。

別の回避策は、独自の依存関係プロパティ(DP)を作成し、DPとコントロールのDPの間にバインディングを作成することです。これにより、WPFスタイルで変更通知が提供されます。

これが これに関する記事 です。

16
Libor

添付のイベントハンドラーに依存関係プロパティを登録すると、これを行うことができます。依存関係プロパティの構文と、PropertyChangedイベントハンドラーで古い値を取得する方法を以下に示します。

//Declaration of property
public static readonly DependencyProperty MyNameProperty =
            DependencyProperty.Register("MyName", typeof(PropertyType),
                                        typeof(ClassName),
                                        new PropertyMetadata(null,
                                                             new PropertyChangedCallback(MyNameValueChanged)));

//PropertyChanged event handler to get the old value
private static void MyNameValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
    object oldValue = eventArgs.OldValue; //Get the old value
}
7
VS1