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

时间:2009-05-13 14:25:15

标签: wpf mvvm

我理解在MVVM中:

  • View了解ViewModel
  • ViewModel知道Model
  • 但它无法正常工作,因此模型对ViewModel
  • 一无所知
  • 并且ViewModel对View
  • 一无所知

所以 ViewModel如何响应用户在视图上执行的操作,例如在TextBox中键入内容或移动滑块等

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

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

  3. 然后我read advice,例如“在MVVM中尽可能少地使用RoutedEvents 没有RoutedCommands “好的。

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

  5. 然后有些人也在使用“ RelayCommand ”。

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

    使用Code Behind ,在MVVM中做过去十年我们所做的最好的方法是什么?

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

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:6)

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

的中继命令

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

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