实施 CanExecuteChanged 的​​首选方式是什么?

What's the preferred way of implementing CanExecuteChanged?

我正在使用的代码,我所做的唯一更改是在 void Changed([CallerMemberName] string name = "") 方法中添加了 [CallerMemberName] 属性。在昨天的一篇文章中,我读到了那篇文章而不是

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

我可以替换这部分:

    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

; 并添加一个函数来处理 CanExecuteChanged in Command class 像这样:

    public void Evaluate() => CanExecuteChanged?.Invoke(null, EventArgs.Empty);

并在 FirstNamesettersPerson class 的 LastName 属性中调用 Evaluate 方法。我已经用 add/removeEvaluate 测试了该应用程序,两者都有效。

这些哪个更有效率?

在这段代码中

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

RequirySuggested 事件是 CommandManager.InvalidateRequerySuggested method.

正常工作所必需的

此方法用于使命令绑定无效并更新所有命令CanExecute。您使用 CanExecuteChanged?.Invoke(null, EventArgs.Empty); 为您的 Person class 手动完成了几乎相同的操作。但在某些情况下,仍然需要 CommandManager.InvalidateRequerySuggested,例如,当您需要在 Person class 之外或从其他 ViewModel 更新命令绑定时。

还有一个 SO thread 对你的问题有不同的看法。