38

我从 Josh Smith 的 MVVM教程中获得了以下代码。

任何人都可以快速解释这段代码的实际作用吗?

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

我无法理解两件事:

  1. 活动是做什么的CanExecuteChanged
  2. 做什么CommandManager.RequerySuggested

上面的代码来自这里RelayCommand的类。

4

2 回答 2

50
  1. CanExecuteChanged通知绑定到的任何命令源(如 aButton或)返回的值已更改。命令源关心这一点,因为它们通常需要相应地更新其状态(例如,如果返回, a将禁用自身)。MenuItemICommandCanExecuteButtonCanExecute()false
  2. CommandManager.RequerySuggested每当CommandManager认为某些事情发生了变化,会影响命令的执行能力时,就会引发该事件。例如,这可能是焦点的改变。事实证明,这个事件触发了很多。

因此,从本质上讲,这段代码所做的是确保每当命令管理器认为命令的执行能力发生了变化时,CanExecuteChanged即使它实际上并没有改变,该命令也会触发。

我实际上不喜欢这种实现方法ICommand.CanExecuteChanged- 它感觉很懒惰并且并不完全可靠。我更喜欢一种更细粒度的方法,其中命令公开一个方法(例如RaiseCanExecuteChanged()),您可以调用 raise CanExecuteChanged,然后在适当的时间从您的视图模型中调用它。

例如,如果您有一个删除当前选定客户的命令,它将有一个CanExecute()处理程序,该处理程序仅在选定客户时才返回trueRaiseCanExecuteChanged因此,只要选定的客户发生变化,您就会打电话。

于 2011-07-09T15:42:18.407 回答
6
  • RoutedCommands如果它们发生了变化,可以自动通知CanExecute,因为我们在ICommand这里实现,WPF 系统不知道,我们将它们连接到 CommandManager 的RequerySuggested事件。
  • 现在,当焦点更改、任何控件被编辑等时,WPF 系统经常调用此事件。因此反过来又会CanExecuteChanged引发此事件。当您的按钮正在侦听此事件时,它将重新调用CanExecute以了解最新状态。

这是一篇可能感兴趣的文章。

于 2011-07-09T14:21:48.673 回答