【问题标题】:Commands in MVVMMVVM 中的命令
【发布时间】:2013-02-21 07:58:22
【问题描述】:

我一直在看到人们在他们的代码中创建诸如 CanExecute 之类的方法的教程。我假设他们这样做是为了帮助读者了解它是如何工作的。当我查找 Command 和 ICommand 时,它会将我带到 MSDN 上用于 Windows Store 应用程序的 ICommand 类。 WPF没有Command类吗?

【问题讨论】:

    标签: wpf mvvm command msdn


    【解决方案1】:

    WPF 中ICommand 的内置实现是RoutedCommand(及其兄弟RoutedUICommand)。 RoutedCommand 是这样工作的:

    RoutedCommand 上的 ExecuteCanExecute 方法不包含 命令的应用程序逻辑与典型的情况一样 ICommand,而是这些方法引发了遍历 元素树正在寻找带有CommandBinding 的对象。事件 附加到CommandBinding 的处理程序包含命令逻辑。

    问题在于这些事件处理程序必须附加到您的 view 的代码隐藏中,这正是您在 MVVM 中所做的 .

    您在代码中看到 CanExecute 方法的教程(我们真正的意思是 ICommand 实现之外的代码)正在使用自定义命令实现,例如 DelegateCommandRelayCommand旨在将其CanExecute/Execute 逻辑“转发”到动态提供的功能;通常,这些是视图模型上公开命令的方法。

    这些实现通常由 MVVM 框架提供(对于这两个示例,框架分别是 Prism 和 MVVM Light),但它们非常简单(都是开源的,获取代码并阅读它)并且没有什么能阻止你如果您不想要整个框架,请复制/粘贴代码。

    您可以将以上内容总结为“在 WPF 中 内置了一个命令类,但它在 MVVM 的上下文中并没有真正有用”。

    【讨论】:

    • 可能应该注意,根据新的 OP 对 MVVM 的影响,您可以非常简单地实现自己的 DelegateCommand 版本,而无需使用特定的 MVVM 框架。
    • @Ryan:谢谢,我完成了对答案的一些编辑,现在它反映了您的建议。
    • 所以DelegateCommand是微软提供给我用的?这是我的第一个 WPF 应用程序和我的第一个 MVVM 应用程序。虽然我已经使用 WinForms 几年了。到目前为止,我真的很喜欢 WPF!因为这是我的第一个 MVVM 应用程序,所以我宁愿自己创建所有代码,而不是使用任何像 MVVM Light 这样的框架,这样我可以更好地了解一切是如何工作的。
    • @RandomlyKnighted:是的,你可以去Prism project site,获取源代码(如果你要分发应用程序,请先检查许可证)并使用它。请记住,MVVM 框架在很大程度上是开源的,它对您的帮助甚至超过了自己编写代码(您仍然可以看到事情是如何工作的,并且您可以观察到他们为什么决定以他们亲身经历的方式做事经验)。
    • @Jon DelegateCommand 可以与 .NET 3.0 一起使用吗?我将我的应用程序定位到该框架,因为当我们第一次使用它们时,我们使用的 3/4 计算机没有最新的框架。 (当然,当我们完成后,他们已经安装了 .NET Framework 4。)
    猜你喜欢
    • 2011-07-22
    • 2016-07-08
    • 2010-12-01
    • 1970-01-01
    • 2011-01-06
    • 2015-08-24
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多