我有一个包含多个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)
我更喜欢偶尔不会抛出异常的代码。有人有更好的例子吗?
答案 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/