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

MVVM: What is the purpose of a separate ViewModel?

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

我知道这个技术上违反了单一职责原则,但是由于XAML和代码隐藏是相互独立定义的,所以它不会导致通常的混乱。为所有内容使用单独的视图模型会导致文件结构更加混乱。

ViewModel 描述视图状态。出于测试和重用目的,它必须 UI 独立。 好处:

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