正确实施CanExecuteChanged

时间:2017-08-31 10:05:35

标签: wpf icommand

我有一个包含多个Button和一个Command的视图。对于每个Command,我认为我必须实施ICommand。我的程序将包含一个状态机,因此命令的CanExecute可能会改变运行时。 CanExecuteChanged的唯一实施示例是this

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

here表明这种实施方案是一个糟糕的解决方案。应该使用RaiseCanExecuteChanged()

但我无法使用CanExecuteChanged找到RaiseCanExecuteChanged的正确实施方式。 Here我找到了一个基本示例,但用户说明了

  

是一个非常简单的实现(偶尔会抛出NullReferenceException)

我更喜欢偶尔不会抛出异常的代码。有人有更好的例子吗?

1 个答案:

答案 0 :(得分:0)

您只需要ICommand接口的一个实现。

您可以查看RelayCommand类是如何在MvvmLight中实现的,这是一个流行但轻量级的MVVM库:https://github.com/lbugnion/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(PCL)/Command/RelayCommand.cs

它有RaiseCanExecuteChanged()方法,只会引发CanExecuteChanged事件。每当要“刷新”命令时,都应该调用此方法。

您甚至可以下载MvvmLight个程序集并直接在您的应用程序中使用RelayCommand类:https://www.nuget.org/packages/MvvmLight/