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

Edw*_*uay 21 wpf mvvm

我理解在MVVM中:

  • View了解ViewModel
  • ViewModel了解Model
  • 但它没有向上工作,因此模型对ViewModel一无所知
  • 并且ViewModel对View一无所知

那么ViewModel如何响应用户对View所做的操作,例如在TextBox中键入内容或移动滑块等.

  1. 我知道这是通过RoutedEvents完成的,但我发现几乎所有的RoutedEvent示例都在View中使用CodeBehind,这正是你在MVVM中不再拥有的.

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

  3. 然后,我读的意见,如" 在MVVM 使用RoutedEvents尽可能少,并没有RoutedCommands可言. " OK.

  4. 因此,例如在WPF模型 - 视图 - 视图模型工具包0.1项目中,自己就会形成一个" DelegateCommand ",它看起来也像一个有趣的方式.

  5. 然后有些人也在使用" RelayCommand ".

对于开发应用程序这样核心的事情,这是很多选择和困惑.

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

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

Bri*_*sio 11

需要明确的是,当人们提到DelegateCommandRelayCommand时,他们真的在谈论同样的事情:ICommand的一个实现允许你传递一个委托.您可以互换使用它们.

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

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

  • 在我看来,这是正确的.MVVM模式正变得如此受欢迎,因为RoutedEvents和RoutedCommands(以及其他UI功能)非常沉重.如果要编写封装视图逻辑的分离的可测试类,则需要将它们与视图分离.只要你看看WPF和Silverlight的书籍在这个环境中开发的过时观点,MVVM就会非常闪耀. (3认同)
  • 这很有启发性,谢谢.关于WPF的第一件事告诉你,与WinForms中的旧方法相比,RoutedEvents和RoutedCommands有多好(它们可以通过隧道传播并冒泡树等等),所以我认为这是在MVVM中完成所有操作的方式.有趣的是,即使RoutedEvents和RoutedCommands是如此新颖和改进,它们仍然无法用于编写分离的应用程序. (2认同)

Mar*_*ris 6

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

当您更改值(移动滑块,键入文本框)时,使用绑定并在设置ViewModel中的属性时处理行为.

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