MVVM:单独的ViewModel的目的是什么?

Zer*_*rbu 2 c# wpf mvvm viewmodel

如果它的代码隐藏View只包含带InitializeComponent()调用的构造函数,为什么不直接使用DataContext="{Binding RelativeSource={RelativeSource Self}}"视图本身作为视图模型呢?

我认为这在技术上违反了单一责任原则,但由于XAML和代码隐藏是彼此独立定义的,因此不会导致通常的混乱.为所有内容设置单独的视图模型会导致文件结构更加混乱.

ad1*_*ima 5

ViewModel描述了视图状态.为了测试和重用目的,它必须是独立于UI的.优点:

  1. 您可以通过单元测试覆盖ViewModel,并且您不必在测试中引用UI类
  2. 您可以在其他UI目标上重用ViewModel:控制台应用程序,WinForms应用程序,UWP应用程序,Xamarin iOS/Android应用程序,无显示IoT项目.您只需要为新目标平台编写视图.
  3. 有时即使在WPF和MVVM中,您也必须编写一些代码,仅用于View,因为它可能更简单,可读和可靠,然后为此创建一些新实体.如果您在后面的代码中也有ViewModel,那么你会变得一团糟.