2013-07-19 19 views
14

这是一个非常简单的问题,但我想知道是否有人能解释第四行实际上在做什么?所以第一行给处理程序提供了一个事件。我不知道在什么情况下处理程序将返回null或最后一行是什么。PropertyChangedEventHandler如何工作?

当您通过处理程序对象和哪个属性发生更改时,它对它们做了什么?

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

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

我想我用这个来得到这个code但我想了解它是什么完全做。

+0

没有上下文很难说。你在用什么框架?这不是BCL的一部分,它可能是您正在检查/使用的一些MVVM框架。 – Will

+0

这看起来不像'PropertyChangedEventHandler'特有的东西。这就是处理程序的工作原理。 –

+0

威尔的评论是无稽之谈。这被标记为WPF。 PropertyChangedEventHandler在System.ComponentModel中。 MVVM框架没有这样的东西--MVVM是一种对WPF有用但对WPF不必要的架构模式。无论如何,这个问题是关于事件处理程序如何在C#中工作的,答案不是特定于任何特定事件或框架。 –

回答

35

如果你只是做:

PropertyChanged(this, new PropertyChangedEventArgs(name)) 

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

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)); 
    } 
+0

在竞争条件下,不会复制处理程序,然后调用某个刚才指定的函数不应再被调用?这仅仅是接受的做生意的方式,还是有我缺少的东西? –

+1

@ZachMierzejewski是的,这是预期的行为。订阅者有责任了解,即使在多线程情况下取消订阅,仍然可以最终调用该方法。内置到.NET中的所有类的事件都以这种模式运行。 –

6

handler如果没有处理程序是subscribedevent可以为空,则第四行将引发给定属性名称(执行所有预订的处理程序)的事件。

当您使用绑定时,通常WPF框架将订阅PropertyChanged,因此它可以在绑定属性更改后更新绑定。

7

PropertyChanged是被宣布这样的情况下,根据其在接口定义:

public event PropertyChangedEventHandler PropertyChanged; 

Events被这样的定义实际上是事件处理程序的列表,你可以添加一个语法糖委托(即对功能的引用)通过订阅或通过取消订阅来删除委托。

现在,当您调用一个事件,即PropertyChanged(...)时,内部发生的是内部列表中的每个委托与参数分开调用。这将告诉您的活动的所有订户该事件发生。

现在,与handler变量整个事情的原因是,那PropertyChanged可以为空。如果没有订阅它,那么调用事件(或者事件处理程序列表)将不起作用,所以这只是确保您可以真正执行处理程序的一种方法。

相关问题