Wpf 在MVVM中,ViewModel响应视图中用户操作的最佳方式是什么?

Wpf 在MVVM中,ViewModel响应视图中用户操作的最佳方式是什么?,wpf,mvvm,Wpf,Mvvm,我理解在MVVM中: 视图了解ViewModel ViewModel了解该模型 但它不能向上工作,因此模型对ViewModel一无所知 而ViewModel对视图一无所知 因此,ViewModel如何响应用户在视图上所做的操作,例如在文本框中键入内容或移动滑块等 我知道这是通过RoutedEvents来完成的,但我发现几乎所有RoutedEvent示例都在视图中使用CodeBehind,这正是MVVM中不再有的 这就剩下了RoutedCommands,我在MVVM中找到了更多的例子,但例如,

我理解在MVVM中:

  • 视图了解ViewModel
  • ViewModel了解该模型
  • 但它不能向上工作,因此模型对ViewModel一无所知
  • 而ViewModel对视图一无所知
因此,ViewModel如何响应用户在视图上所做的操作,例如在文本框中键入内容或移动滑块等

  • 我知道这是通过RoutedEvents来完成的,但我发现几乎所有RoutedEvent示例都在视图中使用CodeBehind,这正是MVVM中不再有的

  • 这就剩下了RoutedCommands,我在MVVM中找到了更多的例子,但例如,移动滑块实际上不是那种意义上的命令,而是一个事件,所以我想知道这是否真的是应该使用的

  • 然后我会说“在MVVM中尽可能少地使用RoutedEvents,并且根本不使用RoutedCommand。”好的

  • 这样就剩下了,例如,在WPF团队自己的项目表单中,您有一个“DelegateCommand”,这看起来也是一种有趣的方式

  • 然后一些人也在使用“RelayCommand

  • 对于开发应用程序来说,这样做有很多选择和困惑

    在MVVM中实现我们在过去10年中使用代码隐藏所做的事情的最佳方式是什么

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

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

    更改值(移动滑块、在文本框中键入)时,请在设置ViewModel中的属性时使用绑定和句柄行为


    一般来说,我发现在MVVM应用程序中使用RoutedEvents几乎没有什么理由,但是当您无法通过新的WPF特定方法实现您想要的目标时,它们是一个很好的、熟悉的安慰毯。

    请澄清,当人们提到DelegateCommandRelayCommand时,他们实际上谈论的是同一件事:ICommand的一个实现,它允许您传入一个委托。您可以互换使用它们

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


    我尽可能远离路由事件和代码隐藏。

    这很有启发性,谢谢。关于WPF的书籍告诉你的第一件事是RoutedEvents和RoutedCommand比WinForms中的旧方法好得多(它们可以在树上挖隧道和冒泡,等等),所以我假设MVVM中的一切都是这样做的。有趣的是,尽管RoutedEvents和RoutedCommands是如此新颖和改进,但它们对于编写解耦的应用程序仍然没有用处。MVVM模式变得如此流行是因为RoutedEvents和RoutedCommand(以及其他UI功能)非常繁重。如果要编写封装视图逻辑的解耦、可测试类,则需要将它们与视图解耦。MVVM在这方面真的很出色,只要你看看WPF和Silverlight的书中所说的在这种环境下开发的过时观点。