c# - PropertyChangedEventHandler 是如何工作的?

标签 c# wpf events propertychanged

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

当您将对象和更改的属性传递给处理程序时,它对它们做了什么?

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

if (handler != null)
{
    handler(this, new PropertyChangedEventArgs(name));
}

我想我是用它来得到这个 code但我想充分了解它在做什么。

最佳答案

如果你刚刚做了:

PropertyChanged(this, new PropertyChangedEventArgs(name))

如果没有人订阅事件 PropertyChanged,您将得到一个 NullReferenceException。为了解决这个问题,您添加了一个空检查:

if(PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(name))
}

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

  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }

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

大多数时候你会看到人们使用关键字 var 来代替,这样你就不需要输入临时变量的完整类型,这是你最常看到的形式通常在代码中。

  var handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }

关于c# - PropertyChangedEventHandler 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736571/

相关文章:

c# - WPF 设计器在启动时不运行窗口静态构造函数

c# - WCF 如何将 List<T> 作为 XML 请求发送

c# - Caliburn.Micro 实现 INotifyDataErrorInfo

c# - 如何将此语句转换为XAML?

javascript - Javascript 中将 Mouse Enter 和 Mouseleave 放置在何处

c# - 以编程方式重命名计算机

c# - 不同 DataGrid 行的不同选择颜色

wpf - 绑定(bind)到 DataContext 中的项目数

android - 如何将事件添加到android calendarview

javascript - 如何使用 jQuery 停止默认链接点击行为