C# MVVM:独立ViewModel的用途是什么?

C# MVVM:独立ViewModel的用途是什么?,c#,wpf,mvvm,viewmodel,C#,Wpf,Mvvm,Viewmodel,如果视图的隐藏代码只包含带有InitializeComponent()调用的构造函数,为什么不直接使用DataContext=“{Binding RelativeSource={RelativeSource Self}”并将视图本身用作视图模型 我知道这在技术上违反了单一责任原则,但由于XAML和代码隐藏是相互独立定义的,因此不会造成通常的混乱。对所有内容使用单独的视图模型会导致文件结构更加混乱。ViewModel描述视图状态。为了测试和重用,它必须是独立于UI的。 好处: 您可以通过单元测试覆

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


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

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

  • 您可以通过单元测试覆盖ViewModel,而不必参考UI 考试中的班级
  • 您可以在其他UI目标上重用ViewModel: 控制台应用程序、WinForms应用程序、UWP应用程序、Xamarin iOS/Android应用程序,无 显示物联网项目。您将需要为新的目标平台编写纯视图
  • 有时,即使在WPF和MVVM中,您也必须编写一些只用于查看目的的代码,因为它可能更简单、可读和可靠,然后为此创建一些新的实体。如果在代码隐藏中也有ViewModel,那么您将陷入混乱
    首先,它允许您在不需要UI自动化的情况下运行单元测试。ViewModel旨在独立于UI以允许单元测试。您错了。代码隐藏旨在用于除UI相关代码之外的任何东西。如果您有自定义动画等,您可以在代码隐藏中自由使用它们。我推荐您阅读一篇好文章:“AdvancedMVVM”,使用viewModels,您可以为项目建立层次结构,并且可以自由地将表示层切换到另一层。