【问题标题】:Why we don't use UI Elements in Viewmodel in MVVM Viewmodel Pattern为什么我们不在 MVVM 视图模型模式中的视图模型中使用 UI 元素
【发布时间】:2018-07-21 05:35:48
【问题描述】:

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

【问题讨论】:

  • 这几乎肯定会因为太宽泛而被标记,但保持视图模型和视图分离的一个很好的理由是为了测试。当您的所有逻辑都在视图模型中时,您实际上可以运行整个程序而无需创建任何图形对象。这意味着您可以模拟代码的整个部分并使用依赖注入将它们插入,这反过来意味着您现在可以为所有实际代码编写自动化测试。这样做还有很多很多其他原因......包括它迫使您更好地构建您的架构。

标签: c# .net wpf mvvm


【解决方案1】:

您不要在 ViewModel 中使用 UIElement,因为 MVVM 原则将 UIElement 定义为驻留在 View 中。 UIElements 的正确放置位置,由 John Gossman 在文章Introduction to Model/View/ViewModel pattern for building WPF apps 中定义:

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

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

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

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

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

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

【讨论】:

  • 不要喂鸽子。 Stance on answering “bad” questionsShould one advise on off-topic questions?。另外,“MVVM 的创建者 John Gossman” - 不,是 Ken Cooper 和 Ted Peters。 en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
  • @FrankM,非常感谢您的清晰解释。
  • @MickyD 我不认为这是一个坏问题。够准确,你可以给个客观的答案。
  • @user10092067 还有一点很重要。一个 UIElement 不能有多个父元素。想象一下,例如同时在两个或多个 ItemsControls 中显示的视图模型项的集合。这不适用于 UIElement 项目。为了稍后将应用程序移植到不同的框架:如果这很重要,您必须避免在视图模型中使用 UI 框架中的 any 类型,而不仅仅是 UIElements,例如ImageSource、几何、画笔。
  • @Clemens,感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2013-05-27
相关资源
最近更新 更多