【问题标题】:In MVVM, what is the best way for the ViewModel to respond to user actions in the View?在 MVVM 中,ViewModel 响应 View 中的用户操作的最佳方式是什么?
【发布时间】:2009-05-13 14:25:14
【问题描述】:

我明白在 MVVM 中:

  • View 知道 ViewModel
  • ViewModel 了解模型
  • 但它不能向上工作,所以模型对视图模型一无所知
  • ViewModel 对 View 一无所知

那么 ViewModel 如何响应用户在 View 上执行的操作,例如在 TextBox 中输入内容或移动滑块等。

  1. 我知道这是通过 RoutedEvents 完成的,但我发现的几乎所有 RoutedEvent 示例都在视图中使用 CodeBehind,而这正是 MVVM 中所没有的。

  2. 所以剩下的 RoutedCommands 我在 MVVM 中找到了更多示例,但例如从这个意义上说,移动滑块真的不是一个命令,它是一个事件,所以我想知道这是否真的应该使用。

  3. 然后我read advice 比如“在 MVVM 中尽可能少使用 RoutedEvents,而根本不用 RoutedCommands " 好的。

  4. 这样就可以了,例如在 WPF 团队自己的 WPF Model-View-ViewModel Toolkit 0.1 项目中,您有一个“DelegateCommand”,这看起来也很有趣。

  5. 那么有些人也在使用“RelayCommand”。

对于开发应用程序来说,做如此核心的事情有很多选择和困惑。

在 MVVM 中简单地完成我们过去 10 年使用 Code Behind 所做的最好方法是什么

  • 创建按钮
  • 双击按钮
  • 编写处理代码

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    需要明确的是,当人们提到 DelegateCommandRelayCommand 时,他们实际上是在谈论同一件事:允许您传入委托的 ICommand 实现.您可以互换使用它们。

    就我而言,将视图 (XAML) 绑定到 ViewModel 中的 DelegateCommands 是实现 MVVM 的最佳方式。

    我尽可能远离 RoutedEvents 和代码隐藏。

    【讨论】:

    • 这很有启发性,谢谢。关于 WPF 的书籍告诉你的第一件事是 RoutedEvents 和 RoutedCommands 比 WinForms 中的旧方法好多少(它们可以向下隧道并在树上冒泡,等等),所以我认为这就是在 MVVM 中完成所有事情的方式。有趣的是,尽管 RoutedEvents 和 RoutedCommands 如此新和改进,但它们对于编写解耦应用程序仍然没有用处。
    • 这是正确的,在我看来。 MVVM 模式变得如此流行,因为 RoutedEvents 和 RoutedCommands(以及其他 UI 功能)非常繁重。如果要编写封装视图逻辑的解耦、可测试的类,则需要将它们与视图解耦。 MVVM 确实在这一点上大放异彩,只要您将 WPF 和 Silverlight 书籍中的内容视为在此环境中开发的过时视图。
    【解决方案2】:

    对于按钮和其他触发器,我使用 WPF 提供的 ICommand 接口,其方式与您链接到的 DelegateCommand 类似。 (实际上我使用here定义的中继命令)

    当您更改值(移动滑块、在文本框中输入内容)时,在设置 ViewModel 中的属性时使用绑定和处理行为。

    通常我发现在 MVVM 应用程序中使用 RoutedEvents 的理由很少,但是当您无法通过新的 WPF 特定方法实现您想要的目标时,它们是一个很好的、熟悉的舒适毯子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2012-12-22
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      相关资源
      最近更新 更多