C# 为什么我们不';t在MVVM Viewmodel模式中使用Viewmodel中的UI元素

C# 为什么我们不';t在MVVM Viewmodel模式中使用Viewmodel中的UI元素,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我对viewmodel模式有一些疑问。我的疑问是,为什么我们不在viewmodel中使用UI元素。如果我们在viewmodel中使用UI元素,会出现什么性能问题?。请给出任何建议。在视图模型中不使用UIElements,因为MVVM原则定义了要驻留在视图中的UIElements。John Gossman在文章中定义了UIElements的正确位置: Model/View/ViewModel中的视图由可视化元素、按钮、窗口、图形和GUI中更复杂的控件组成 您不在MVVM应用程序的ViewModel

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

在视图模型中不使用UIElements,因为MVVM原则定义了要驻留在视图中的UIElements。John Gossman在文章中定义了UIElements的正确位置:

Model/View/ViewModel中的视图由可视化元素、按钮、窗口、图形和GUI中更复杂的控件组成


您不在MVVM应用程序的ViewModel中使用UIElements,至少有两个原因:

  • 当以后将应用程序移植到另一个UI框架时,如果所有与UI相关的代码都只在一个模块(即视图)中,那么就容易多了。如果UI代码分布在视图和ViewModel中,那么移植将更加困难
  • 如果所有与UI相关的代码都在视图中,那么单元测试就容易多了
当然,对于大多数开发人员来说,后一个原因是最重要的。WPF-MVVM之父Josh Smith在他的文章中这样说:

如果可以在不创建任何UI对象的情况下为ViewModel编写单元测试,也可以完全对ViewModel进行蒙皮,因为它对特定的可视元素没有依赖关系


UIElements对于单元测试来说很麻烦,因为WPF UIElements需要一个布局度量渲染循环才能正常工作。然而,在单元测试中,您通常没有这样的循环。

由于太宽,几乎肯定会被标记,但是保持视图模型和视图分离的一个很好的原因是为了测试。当所有逻辑都在视图模型中时,实际上可以运行整个程序,而无需创建任何图形对象。这意味着您可以模拟代码的整个部分,并使用依赖项注入插入它们,这反过来意味着您现在可以为所有实际代码编写自动测试。做这件事还有很多其他原因……包括它迫使你更好地构建你的架构。不要给鸽子喂食。和。另外,“由MVVM的创建者约翰·戈斯曼(John Gossman)所作”——不,是肯·库珀(Ken Cooper)和特德·彼得斯(Ted Peters)@弗兰克姆,非常感谢你的清楚解释。@MickyD我不认为这是一个坏问题。它足够精确,你可以给出一个客观的答案。@user10092067还有一点很重要。UIElement不能有多个父元素。例如,假设视图模型项的集合同时显示在两个或多个ItemsControl中。这对UIElement项不起作用。对于以后将应用程序移植到其他框架的问题:如果这是一个严肃的问题,您必须避免在视图模型中使用UI框架中的任何类型,而不仅仅是UIElements,例如ImageSource、Geometry、Brush。@Clemens,谢谢您的解释。