C# INotifyPropertyChanged 处理程序

标签 c# wpf events mvvm

我开始阅读有关 MVVM 的内容,我经常看到的一种模式是:

public event PropertyChangedEventHandler PropertyChanged;
//.....

PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
    var e = new PropertyChangedEventArgs(propertyName);
    handler(this, e);
}

为什么要声明这个 handler 变量?在我看来,它只是不必要地使代码复杂化,但我什至可以在 Microsoft 自己的教程中看到这一点,为什么不将其用作:

if (this.PropertyChanged != null)
{
    var e = new PropertyChangedEventArgs(propertyName);
    this.PropertyChanged(this, e);
}

最佳答案

关闭 PropertyChanged 事件是为了线程安全。事实上,从技术上讲,您应该对所有您的事件执行此操作。

赋值会创建事件及其处理程序的副本(不是引用,这将毫无用处),这意味着您可以避免事件处理程序在传递后立即设置为 null 的情况null 检查。这避免了会引发 NullReferenceException 的潜在竞争条件。

实际上,UI 并不经常将该属性设置为 null(如果有的话)。但是,为了安全起见并采用良好做法,您应该关闭处理程序。

关于C# INotifyPropertyChanged 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805397/

相关文章:

wpf - 任何人都知道如何从使用 DataTemplate 作为其列表框项的 WPF 列表框中删除默认突出显示颜色?

javascript - 向事件添加 JavaScript 函数调用(例如 'window.resize' ),而不是覆盖已有的内容

c# - 缓存 ASP.NET AJAX 服务 javascript 代理

c# - 如何在 C# 中使用 regex.replace 将单个字符替换为反斜杠

c# - 使用StreamReader/StreamWriter抓取日志导致程序停止响应

javascript - 添加跨浏览器事件监听器

java - 将点击处理程序添加到 GWT 中的 Horizo​​ntalPanel

c# - 为什么不允许使用 nameof(object)?

c# - 如何获取上一页的值

c# - 在 ListView 中搜索字符串和过滤器