3

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

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

然后在阅读了关于 SO 的这个答案之后,我还在我的课堂上复制了来自 Prism 的 DelegateCommand 类的代码。

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

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

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

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

4

3 回答 3

2

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

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

CommandManager.OnRequerySuggested();

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

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

于 2012-10-16T10:54:59.367 回答
1

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

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

protected void RaiseMyEvent()
{
if (MyEvent != null)
{
MuEvent(this, args)
}
}
于 2012-10-16T10:54:00.623 回答
1

我认为您想要CommandManager.InvalidateRequerySuggested。它强制RequerySuggested引发事件。

于 2012-10-16T10:51:48.077 回答