CanExecuteChanged和CommandManager.RequerySuggested的实际任务是什么?

时间:2011-07-09 12:37:17

标签: wpf icommand relaycommand

我从Josh Smith的MVVM tutorial获得了以下代码。

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

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

我无法理解两件事:

  1. CanExecuteChanged事件的作用是什么?
  2. CommandManager.RequerySuggested做什么?
  3. 以上代码来自hereRelayCommand类。

2 个答案:

答案 0 :(得分:46)

  1. CanExecuteChanged通知绑定到Button的任何命令源(如MenuItemICommand),CanExecute返回的值已更改。命令来源关心这一点,因为他们通常需要相应地更新其状态(例如,如果Button返回CanExecute()false将自行禁用。
  2. 只要CommandManager.RequerySuggested认为某些内容已发生变化,影响命令执行能力,就会引发CommandManager事件。例如,这可能是焦点的变化。事实证明这个事件引发了很多。
  3. 因此,从本质上讲,这段代码的作用是确保只要命令管理器认为命令的执行能力发生了变化,即使命令实际没有发生变化,命令也会引发CanExecuteChanged

    我实际上不喜欢这种方法来实现ICommand.CanExecuteChanged - 它感觉很懒,并不完全可靠。我更喜欢一种更精细的方法,其中命令公开了一个方法(例如。RaiseCanExecuteChanged()),你可以调用它来引发CanExecuteChanged,然后你在视图模型的适当时候调用它。

    例如,如果您有一个删除当前所选客户的命令,那么只有在选择了客户时,它才会有一个CanExecute()处理程序返回true。因此,只要所选客户发生变化,您就会致电RaiseCanExecuteChanged

答案 1 :(得分:5)

  • RoutedCommands可以自动通知他们的CanExecute是否已更改,因为我们正在此处实现ICommand,WPF系统不知道,我们将它们连接到CommandManager的{{1}事件。
  • 现在,当焦点发生变化,任何控件都被编辑等时,WPF系统会经常调用此事件。因此,RequerySuggested会引发CanExecuteChanged。当您的按钮正在收听此事件时,它将重新调用CanExecute以了解最新状态。

以下是可能感兴趣的article