MVVM中的命令

5

我看过一些教程,其中有人在代码中创建CanExecute这样的方法。我猜他们这样做是为了帮助读者理解它们是如何工作的。当我搜索Command和ICommand时,它会跳转到MSDN上用于Windows Store应用程序的ICommand类。那么,WPF没有Command类吗?

1个回答

8
WPF中内置的ICommand实现是RoutedCommand(以及它的兄弟RoutedUICommand)。RoutedCommand的工作原理如下:

RoutedCommand上的ExecuteCanExecute方法不包含命令的应用程序逻辑,就像典型的ICommand一样,而是引发事件,遍历元素树查找具有CommandBinding的对象。附加到CommandBinding的事件处理程序包含命令逻辑。

这样做的问题在于,这些事件处理程序必须附加到视图的代码后台,这正是在MVVM中不想要的。
在代码中看到CanExecute方法的教程(我们真正意思是ICommand实现之外的代码)使用自定义命令实现,例如DelegateCommandRelayCommand,它们被设计为将它们的CanExecute/Execute逻辑“转发”到动态提供的函数;通常,这些是公开命令的视图模型上的方法。
这些实现通常由MVVM框架(对于这两个示例,框架分别是Prism和MVVM Light)提供,但它们非常简单(两者都是开源的,获取代码并阅读它),没有什么可以阻止您从复制/粘贴代码,如果您不想使用整个框架。
您可以总结上述内容为“在WPF中确实内置了一个命令类,但在MVVM上下文中并不真正有用”。

1
需要注意的是,根据OP对MVVM的熟悉程度,您可以非常简单地实现自己的DelegateCommand版本,而无需使用特定的MVVM框架。 - Thelonias
@Ryan:谢谢,我对答案进行了一些编辑,现在反映了你的建议。 - Jon
DelegateCommand是由Microsoft提供给我的吗?这既是我的第一个WPF应用程序,也是我的第一个MVVM应用程序。虽然我已经使用WinForms几年了。到目前为止,我真的很喜欢WPF!因为这是我的第一个MVVM应用程序,所以我宁愿自己创建所有代码,而不使用任何框架,如MVVM Light,这样我就可以更好地理解一切是如何工作的。 - pallasmedia
@RandomlyKnighted: 是的,你可以访问Prism项目网站,下载源代码(如果你要分发应用程序,请先查看许可证)。请记住,MVVM框架大多数都是开源的,这可以比自己编写代码更有帮助(你仍然可以看到如何工作,并通过第一手经验观察他们决定以其方式做事情的原因)。 - Jon
@Jon,DelegateCommand能在.NET 3.0上使用吗?我正在针对该框架开发我的应用程序,因为我们工作的计算机中有3/4没有安装最新的框架。(当然,当我们完成后,它们都已安装了.NET Framework 4。) - pallasmedia
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接