【发布时间】:2013-02-21 07:58:22
【问题描述】:
我一直在看到人们在他们的代码中创建诸如 CanExecute 之类的方法的教程。我假设他们这样做是为了帮助读者了解它是如何工作的。当我查找 Command 和 ICommand 时,它会将我带到 MSDN 上用于 Windows Store 应用程序的 ICommand 类。 WPF没有Command类吗?
【问题讨论】:
我一直在看到人们在他们的代码中创建诸如 CanExecute 之类的方法的教程。我假设他们这样做是为了帮助读者了解它是如何工作的。当我查找 Command 和 ICommand 时,它会将我带到 MSDN 上用于 Windows Store 应用程序的 ICommand 类。 WPF没有Command类吗?
【问题讨论】:
WPF 中ICommand 的内置实现是RoutedCommand(及其兄弟RoutedUICommand)。 RoutedCommand 是这样工作的:
RoutedCommand上的Execute和CanExecute方法不包含 命令的应用程序逻辑与典型的情况一样ICommand,而是这些方法引发了遍历 元素树正在寻找带有CommandBinding的对象。事件 附加到CommandBinding的处理程序包含命令逻辑。
问题在于这些事件处理程序必须附加到您的 view 的代码隐藏中,这正是您在 MVVM 中所做的不 .
您在代码中看到 CanExecute 方法的教程(我们真正的意思是 ICommand 实现之外的代码)正在使用自定义命令实现,例如 DelegateCommand 和 RelayCommand旨在将其CanExecute/Execute 逻辑“转发”到动态提供的功能;通常,这些是视图模型上公开命令的方法。
这些实现通常由 MVVM 框架提供(对于这两个示例,框架分别是 Prism 和 MVVM Light),但它们非常简单(都是开源的,获取代码并阅读它)并且没有什么能阻止你如果您不想要整个框架,请复制/粘贴代码。
您可以将以上内容总结为“在 WPF 中 内置了一个命令类,但它在 MVVM 的上下文中并没有真正有用”。
【讨论】: