PropertyChangedEventHandler如何工作?

Jam*_*eet 16 c# wpf events propertychanged

这是一个非常简单的问题,但我想知道是否有人可以解释第4行实际上在做什么?所以第一行给处理程序一个事件.我真的不知道在什么情况下处理程序将返回null或最后一行的作用.

当你传递处理程序时你的对象和属性发生了变化,它对它们有什么作用?

PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event

if (handler != null)
{
    handler(this, new PropertyChangedEventArgs(name));
}
Run Code Online (Sandbox Code Playgroud)

我假设我使用它来获取此代码,但我想了解它正在做什么.

Sco*_*ain 38

如果你刚刚做了:

PropertyChanged(this, new PropertyChangedEventArgs(name))
Run Code Online (Sandbox Code Playgroud)

NullReferenceException如果没有人订阅该活动,你会得到一个PropertyChanged.要抵消这一点,您需要添加一个空检查:

if(PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(name))
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你使用多线程,有人可以在null检查和事件调用之间取消订阅,所以你仍然可以得到一个 NullReferenceException.为了处理这个问题,我们将事件处理程序复制到临时变量

  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }
Run Code Online (Sandbox Code Playgroud)

现在,如果有人取消订阅该事件,我们的临时变量handler仍将指向旧函数,此代码现在无法抛出NullReferenceException.

大多数情况下,您会看到人们使用关键字var代替,这使得您无需输入完整类型的临时变量,这是您在代码中最常见的表单.

  var handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 9

PropertyChanged 是根据界面中的定义声明的事件:

public event PropertyChangedEventHandler PropertyChanged;
Run Code Online (Sandbox Code Playgroud)

像这样定义的事件实际上是事件处理程序列表的语法糖,您可以通过订阅添加委托(即对函数的引用),或通过取消订阅删除委托.

现在,当你调用一个事件时,即PropertyChanged(...)内部发生的事情是该内部列表中的每个委托都是用参数分别调用的.这将告诉您事件的所有订阅者事件发生.

现在,整个handler变量的原因是,PropertyChanged可以为null.如果没有订阅它,那么调用事件(或者更确切地说是事件处理程序列表)将不起作用,因此这只是确保您可以实际执行处理程序的一种方法.


H.B*_*.B. 6

handler如果没有处理程序订阅事件,则为null ,第四行引发给定属性名称的事件(执行所有已订阅的处理程序).

通常,WPF框架将PropertyChanged在您使用绑定时进行订阅,因此一旦绑定属性更改,它就可以更新绑定.