为什么我们不在MVVM Viewmodel模式的Viewmodel中使用UI元素

时间:2018-07-21 05:35:49

标签: c# .net wpf mvvm

我对viewmodel模式有些怀疑。我的疑问是,为什么我们不在viewmodel中使用UI元素。如果我们在viewmodel中使用UI元素,会发生什么性能问题?请提出任何建议。

1 个答案:

答案 0 :(得分:1)

您没有在ViewModels中使用UIElement,因为MVVM原理定义了UIElement以驻留在View中。 John Gossman在文章Introduction to Model/View/ViewModel pattern for building WPF apps中定义了UIElement的正确位置:

  

模型/视图/视图模型中的视图由可视元素,按钮,窗口,图形和GUI的更复杂控件组成。

出于以下两个原因,您没有在MVVM应用程序的ViewModel中使用UIElement:

  • 以后将应用程序移植到另一个UI框架时,如果所有与UI相关的代码都在一个模块(即View)中,则容易得多。如果将UI代码分布在View和ViewModel上,移植将变得更加困难。
  • 如果所有与UI相关的代码都在View中,则单元测试要容易得多。

对于大多数开发人员来说,后一个原因当然是最重要的。 WPF-MVVM之父Josh Smith在他的文章Patterns - WPF Apps With The Model-View-ViewModel Design Pattern中这样写:

  

如果您可以在不创建任何UI对象的情况下为ViewModel编写单元测试,则还可以完全使ViewModel外观化,因为它不依赖于特定的可视元素。

UIElement对于单元测试很麻烦,因为WPF UIElement需要layout-measure-render循环才能正常工作。但是,在单元测试中,通常没有这样的循环。