收听DependencyProperty更改事件并获取旧值

sea*_*717 18 wpf dependency-properties

我有以下代码为类的VisiblePosition属性订阅属性更改事件Column:

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

if (dpd != null)
{
   dpd.AddValueChanged(col, ColumnVisiblePositionChangedHandler);
}
Run Code Online (Sandbox Code Playgroud)

以下是该ColumnVisiblePositionChangedHandler方法的定义:

static internal void ColumnVisiblePositionChangedHandler(object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)

问题是我需要获得属性的旧值.我怎么做?

谢谢,

Lib*_*bor 16

不幸的是,在以这种方式注册属性更改事件处理程序时,您不会获得旧值信息.

一种解决方法是将属性值存储在某处(这是您的'旧'值),然后将其与事件处理程序中的当前值进行比较.

另一种解决方法是创建自己的依赖项属性(DP)并在DP和控件的DP之间创建绑定.这将为您提供WPF样式的更改通知.

这是一篇关于此文章.


VS1*_*VS1 7

在附加的事件处理程序中注册依赖项属性时,可以执行此操作.请在下面找到依赖项属性的语法以及如何在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
}
Run Code Online (Sandbox Code Playgroud)

  • -1 OP询问是否附加了其他人写的属性,而不是如何创建新属性. (10认同)
  • 虽然选择的答案确实是这种情况的正确选择,但VS1的答案正是我所需要的答案.我不会对他的答案进行投票,但我确实想承认他的回答有助于某人解决现实世界中的问题. (4认同)