我看过一些教程,其中有人在代码中创建CanExecute这样的方法。我猜他们这样做是为了帮助读者理解它们是如何工作的。当我搜索Command和ICommand时,它会跳转到MSDN上用于Windows Store应用程序的ICommand类。那么,WPF没有Command类吗?
ICommand
实现是RoutedCommand
(以及它的兄弟RoutedUICommand
)。RoutedCommand
的工作原理如下:
这样做的问题在于,这些事件处理程序必须附加到视图的代码后台,这正是在MVVM中不想要的。
RoutedCommand
上的Execute
和CanExecute
方法不包含命令的应用程序逻辑,就像典型的ICommand
一样,而是引发事件,遍历元素树查找具有CommandBinding
的对象。附加到CommandBinding
的事件处理程序包含命令逻辑。
CanExecute
方法的教程(我们真正意思是ICommand
实现之外的代码)使用自定义命令实现,例如DelegateCommand
和RelayCommand
,它们被设计为将它们的CanExecute
/Execute
逻辑“转发”到动态提供的函数;通常,这些是公开命令的视图模型上的方法。