如果我在C#中重载加载和删除,为什么我不能引发或调用事件#

时间:2012-10-16 10:43:40

标签: c# .net event-handling

从Josh Smith的文章中复制RelayCommand的代码时,我复制了以下代码

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

然后在阅读this answer on SO后,我还在我的班级中复制了Prism的DelegateCommand类的代码。

protected void NotifyCanExecuteChanged()
{
    if (CanExecuteChanged != null)
    {
        CanExecuteChanged(this, EventArgs.Empty);
    }
}

但是他在NotifyCanExecuteChanged方法中给了我一个错误

  

'CanExecuteChanged'事件只能出现在+ =或 - =

的左侧

如果我从事件中删除添加和删除重载,则不会出现此错误。有人可以帮我理解背后的原因吗?

3 个答案:

答案 0 :(得分:2)

使用类似字段的事件(不是add / remove的简单表单的名称),当您执行if(CanExecuteChanged != null)CanExecuteChanged(this, ...)时,{{ 1}}指的是支持字段,它是CanExecuteChanged类型的委托字段。您可以调用委托字段。但是,在您的示例中并非如此,因为那里调用是没有明显的事情。肯定没有本地字段,转发的事件(EventHandler)不会本质上暴露任何“调用”功能。

基本上,要使其工作,您需要访问调用机制。最常见的是,我希望采用以下形式:

CommandManaged.RequerySuggested

如果有一个方法可以调用此事件(并且不需要),则可以将其称为任何

CommandManager.OnRequerySuggested(); 是“引发此事件”API的常见模式,如果它是多态的话,那就是双重的...

答案 1 :(得分:1)

我想你想要CommandManager.InvalidateRequerySuggested。它强制提升RequerySuggested事件。

答案 2 :(得分:1)

您的类似乎继承自声明事件的类。事件只能在基类中直接引发,而不能在继承的类中引发。

如果要在继承的类中引发它,请在基类中编写以下方法并从继承的类中调用它:

protected void RaiseMyEvent()
{
if (MyEvent != null)
{
MuEvent(this, args)
}
}