C# 为什么我们不';t在MVVM Viewmodel模式中使用Viewmodel中的UI元素
我对viewmodel模式有一些疑问。我的疑问是,为什么我们不在viewmodel中使用UI元素。如果我们在viewmodel中使用UI元素,会出现什么性能问题?。请给出任何建议。在视图模型中不使用UIElements,因为MVVM原则定义了要驻留在视图中的UIElements。John Gossman在文章中定义了UIElements的正确位置: Model/View/ViewModel中的视图由可视化元素、按钮、窗口、图形和GUI中更复杂的控件组成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
您不在MVVM应用程序的ViewModel中使用UIElements,至少有两个原因:
- 当以后将应用程序移植到另一个UI框架时,如果所有与UI相关的代码都只在一个模块(即视图)中,那么就容易多了。如果UI代码分布在视图和ViewModel中,那么移植将更加困难
- 如果所有与UI相关的代码都在视图中,那么单元测试就容易多了
UIElements对于单元测试来说很麻烦,因为WPF UIElements需要一个布局度量渲染循环才能正常工作。然而,在单元测试中,您通常没有这样的循环。由于太宽,几乎肯定会被标记,但是保持视图模型和视图分离的一个很好的原因是为了测试。当所有逻辑都在视图模型中时,实际上可以运行整个程序,而无需创建任何图形对象。这意味着您可以模拟代码的整个部分,并使用依赖项注入插入它们,这反过来意味着您现在可以为所有实际代码编写自动测试。做这件事还有很多其他原因……包括它迫使你更好地构建你的架构。不要给鸽子喂食。和。另外,“由MVVM的创建者约翰·戈斯曼(John Gossman)所作”——不,是肯·库珀(Ken Cooper)和特德·彼得斯(Ted Peters)@弗兰克姆,非常感谢你的清楚解释。@MickyD我不认为这是一个坏问题。它足够精确,你可以给出一个客观的答案。@user10092067还有一点很重要。UIElement不能有多个父元素。例如,假设视图模型项的集合同时显示在两个或多个ItemsControl中。这对UIElement项不起作用。对于以后将应用程序移植到其他框架的问题:如果这是一个严肃的问题,您必须避免在视图模型中使用UI框架中的任何类型,而不仅仅是UIElements,例如ImageSource、Geometry、Brush。@Clemens,谢谢您的解释。