从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'事件只能出现在+ =或 - =
的左侧
如果我从事件中删除添加和删除重载,则不会出现此错误。有人可以帮我理解背后的原因吗?
答案 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)
}
}