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

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
然后在阅读 this answer on SO 之后,我还在我的类(class)中复制了来自 Prism 的 DelegateCommand 类的代码。
protected void NotifyCanExecuteChanged()
{
    if (CanExecuteChanged != null)
    {
        CanExecuteChanged(this, EventArgs.Empty);
    }
}
但是他在 NotifyCanExecuteChanged 方法中给了我一个错误

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

最佳答案

使用类似字段的事件(这是没有 add/remove 的简单表单的名称,那么当您执行 if(CanExecuteChanged != null)CanExecuteChanged(this, ...) 时, CanExecuteChanged 指的是 支持字段 ,它是 EventHandler 类型的委托(delegate)字段。您可以调用委托(delegate)字段。但是,在您的示例中情况并非如此,因为没有明显的要调用的东西。当然没有本地字段,并且转发的事件(CommandManaged.RequerySuggested)本质上不会公开任何“调用”功能.

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

CommandManager.OnRequerySuggested();

但是如果有一个方法可以调用这个事件(并且不需要),它可以被称为任何东西。

(On* 是“引发此事件”API 的常见模式,如果它是多态的,则加倍)

关于c# - 如果我在 C# 中重载了添加和删除,为什么不能引发或调用事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12912941/

10-14 16:34
查看更多