Wp8 - 从app和back重定向时,EventHandler为null

时间:2015-07-01 08:26:44

标签: c# windows-phone-8

在我的应用程序中,我有一个简单的EventHandler(在我的ViewModel中),定义如下:

public event EventHandler FavouriteChangedEvent;

然后,当我需要时,我用这个

开火
FavouriteChangedEvent(this, null);

一切都按预期工作,但在我的应用程序中,有可点击的链接,打开webbrowser(作为单独的应用程序)。当你回到应用程序时,当我尝试运行FavouriteChangedEvent(this, null);时,它以NullPointerException结束(从调试开始,因为FavouriteChangedEvent实际上是空的。)

为什么?

我在互联网上找到了它并使用它

    public delegate void EventHandler(object sender, string myValue);
    public event EventHandler FavouriteChangedEvent = delegate { }; 

但它没有多大帮助。该应用程序不会下降,但在我的View类中,我在构造函数_dataContext.FavouriteChangedEvent += _dataContext_FavouriteChangedEvent;

中有这一行

在外出并返回应用程序后,此事件不再被触发。

1 个答案:

答案 0 :(得分:2)

  

然后,当我需要时,我用这个

开火      

FavouriteChangedEvent(this,null);

     

以NullPointerException结束(从调试开始,因为FavouriteChangedEvent确实为空

这是因为没有事件处理程序尚未

event是一个类

  

一旦类声明了一个事件,它就可以像处理指定的委托类型的字段一样处理该事件。如果没有客户端将事件连接到事件,则该字段将为null,否则它将引用在调用事件时应调用的委托。因此,通常首先检查null然后调用事件来调用事件。

在上升事件之前,您必须至少检查null

if(FavouriteChangedEvent != null)
    FavouriteChangedEvent(this, null);

注意,为了使此线程安全,您必须将事件复制到本地变量,以确保对同一事件进行null检查和升级:

var event = FavouriteChangedEvent;
if(event != null)
    event(this, null);

描述的解决方案(在构造时附加空委托)是另一种可能的线程安全解决方案。

根据event design guidelines

  

请使用受保护的虚拟方法来引发每个事件

这就是说 - 不要像这样上升事件处理程序,而是调用受保护的虚拟方法(称为OnFavouriteChangedEvent),这会引发事件。并且不需要在事件名称中包含单词“event”。简单说明:FavouriteChanged