我从Josh Smith的MVVM tutorial中获得了以下代码。
有谁能快速解释一下这段代码实际上是做什么的?
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我不明白两件事:
CanExecuteChanged
事件的作用是什么?CommandManager.RequerySuggested
的功能是什么?
上面的代码来自RelayCommand
类。
3条答案
按热度按时间g2ieeal71#
CanExecuteChanged
通知绑定到该ICommand
的任何命令源(如Button
或MenuItem
),CanExecute
返回的值已更改。命令源关心这一点,因为它们通常需要相应地更新其状态(例如,如果CanExecute()
返回false
,则Button
将禁用自身)。1.每当
CommandManager
认为某些更改会影响命令的执行能力时,就会引发CommandManager.RequerySuggested
事件。例如,这可能是焦点的更改。事实证明,此事件经常引发。所以,从本质上讲,这段代码所做的是确保每当命令管理器认为命令的执行能力发生了变化,即使它实际上没有发生变化,命令也会引发
CanExecuteChanged
。实际上我不喜欢这种实现
ICommand.CanExecuteChanged
的方法--感觉很懒,而且不完全可靠。我更喜欢更细粒度的方法,其中命令公开一个方法(例如RaiseCanExecuteChanged()
),您可以调用该方法来引发CanExecuteChanged
,然后在适当的时间从视图模型中调用该方法。例如,如果您有一个删除当前选定客户的命令,则该命令将具有一个
CanExecute()
处理程序,该处理程序仅在选定客户时返回true
。因此,只要选定客户发生更改,您就将调用RaiseCanExecuteChanged
。fdx2calv2#
RoutedCommands
可以自动通知它们的CanExecute
是否发生了更改,因为我们在这里实现的是ICommand
,而WPF系统并不知道,所以我们将它们与CommandManager的RequerySuggested
事件关联起来。CanExecuteChanged
。当您的按钮侦听此事件时,它将重新调用CanExecute
以了解最新状态。这里有一个可能会感兴趣的article。
9fkzdhlc3#
实现RaiseCanExecuteChanged()函数
命令类:
查看:
视图模型类: