我从Josh Smith的MVVM tutorial获得了以下代码。
任何人都可以快速解释这段代码的实际用途吗?
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我无法理解两件事:
CanExecuteChanged
事件的作用是什么?CommandManager.RequerySuggested
做什么?以上代码来自here的RelayCommand
类。
答案 0 :(得分:46)
CanExecuteChanged
通知绑定到Button
的任何命令源(如MenuItem
或ICommand
),CanExecute
返回的值已更改。命令来源关心这一点,因为他们通常需要相应地更新其状态(例如,如果Button
返回CanExecute()
,false
将自行禁用。CommandManager.RequerySuggested
认为某些内容已发生变化,影响命令执行能力,就会引发CommandManager
事件。例如,这可能是焦点的变化。事实证明这个事件引发了很多。因此,从本质上讲,这段代码的作用是确保只要命令管理器认为命令的执行能力发生了变化,即使命令实际没有发生变化,命令也会引发CanExecuteChanged
。
我实际上不喜欢这种方法来实现ICommand.CanExecuteChanged
- 它感觉很懒,并不完全可靠。我更喜欢一种更精细的方法,其中命令公开了一个方法(例如。RaiseCanExecuteChanged()
),你可以调用它来引发CanExecuteChanged
,然后你在视图模型的适当时候调用它。
例如,如果您有一个删除当前所选客户的命令,那么只有在选择了客户时,它才会有一个CanExecute()
处理程序返回true
。因此,只要所选客户发生变化,您就会致电RaiseCanExecuteChanged
。
答案 1 :(得分:5)
RoutedCommands
可以自动通知他们的CanExecute
是否已更改,因为我们正在此处实现ICommand
,WPF系统不知道,我们将它们连接到CommandManager的{{1}事件。 RequerySuggested
会引发CanExecuteChanged
。当您的按钮正在收听此事件时,它将重新调用CanExecute
以了解最新状态。以下是可能感兴趣的article。