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)
PropertyChanged 是根据界面中的定义声明的事件:
public event PropertyChangedEventHandler PropertyChanged;
Run Code Online (Sandbox Code Playgroud)
像这样定义的事件实际上是事件处理程序列表的语法糖,您可以通过订阅添加委托(即对函数的引用),或通过取消订阅删除委托.
现在,当你调用一个事件时,即PropertyChanged(...)内部发生的事情是该内部列表中的每个委托都是用参数分别调用的.这将告诉您事件的所有订阅者事件发生.
现在,整个handler变量的原因是,PropertyChanged可以为null.如果没有订阅它,那么调用事件(或者更确切地说是事件处理程序列表)将不起作用,因此这只是确保您可以实际执行处理程序的一种方法.
| 归档时间: |
|
| 查看次数: |
23844 次 |
| 最近记录: |