为了掌握 MVVM 的概念,我已经阅读了几篇博客并查看了一些项目。
据我了解,一个View是愚蠢的,它只知道如何呈现传递给它的东西。
Models只是简单的数据,以及视图模型是充当两者之间的填充物的东西,它应该从Model并将其传递到View,以及View应该知道如何呈现它。或者反过来,如果信息在View更改,它应该将更改传递给Model.
但我仍然不知道如何应用这个概念。有人可以解释一个非常简单的场景,以便我能够理解这个概念吗?我已经看过几个项目,但它仍然不完全有意义,所以如果有人能用简单的英语写出来,那就太好了。
我喜欢这样想:
正如你所说,观点是愚蠢的。乔什·史密斯(Josh Smith),具有开创性且经常被联系在一起的作家MSDN 文章在 MVVM 上,有人说视图是“数据穿的衣服”。视图实际上从未包含数据或直接操作数据,它们只是绑定到视图模型的属性和命令。
模型是建模的对象您的应用程序的域,如业务对象中一样。您的应用程序是音乐商店吗?也许您的模型对象将是艺术家、专辑和歌曲。您的应用程序是组织结构图浏览器吗?也许您的模型对象将是经理和员工。这些模型对象与任何类型的视觉渲染无关,它们甚至与您将它们放入的应用程序没有直接关系 - 您的模型对象本身应该完全有意义,作为代表某种类型的对象系列的域。模型层通常还包括服务访问器之类的东西。
这将我们带到了视图模型。这些是什么?它们是建模的对象一个图形用户界面应用程序,这意味着它们提供供视图使用的数据和功能。它们定义了您正在构建的实际应用程序的结构和行为。对于模型对象,域是您选择的任何域(音乐商店、组织图表浏览器等),但对于视图模型,域是图形应用程序。您的视图模型将封装应用程序所做的一切行为和数据。他们将把对象和列表公开为属性,以及命令之类的东西。命令只是一种行为(最简单的是方法调用),包装到携带它的对象中 - 这个想法很重要,因为视图是由数据绑定驱动的,数据绑定将可视控件附加到对象。在 MVVM 中,您不会为按钮提供 Click 处理程序方法,而是将其绑定到一个命令对象(从视图模型中的属性提供),该对象包含您单击它时要运行的功能。
对我来说,最令人困惑的部分如下:
- 尽管视图模型是图形应用程序的模型,但它们并不直接引用或使用视觉概念。例如,您不希望在 ViewModel 中引用 Windows 控件 - 这些内容位于视图中。 ViewModel 只是将数据和行为公开给控件或其他将绑定到它们的对象。例如 - 您是否有一个包含列表框的视图?您的视图模型几乎肯定会包含某种集合。您的视图有按钮吗?您的视图模型几乎肯定会包含一些命令。
- 有几种对象可以被视为“视图模型”。最容易理解的视图模型是直接以 1:1 关系表示控件或屏幕的视图模型,如“屏幕 XYZ 有一个文本框、一个列表框和三个按钮,因此视图模型需要一个字符串、一个集合、和三个命令。”另一种适合视图模型层的对象是模型对象的包装器,它赋予模型对象行为并使其更易于视图使用 - 这就是您了解“厚”和“薄”视图模型层概念的地方。 “薄”视图模型层是一组将模型对象直接暴露给视图的视图模型,这意味着视图最终会直接绑定到模型对象上的属性。这适用于简单的只读视图之类的事情,但是如果您希望具有与每个对象关联的行为怎么办?您不希望在模型中出现这种情况,因为模型与应用程序无关,它只与您的域相关。您可以将其放入一个对象中,该对象包装您的模型对象并提供更多绑定友好的数据和行为。该包装器对象也被视为视图模型,并且拥有它们会产生“更厚”的视图模型层,其中您的视图永远不会直接绑定到模型类上的任何内容。集合将包含包装模型的视图模型,而不仅仅是包含模型本身。
兔子洞更深入——有很多习惯用法需要弄清楚,比如让 MVVM 保持工作的 ValueConverters,当你开始考虑诸如可混合性、测试以及如何在应用程序中传递数据并确保每个视图模型都可以访问它所需的行为(这就是依赖注入的用武之地),但希望以上是一个好的开始。关键是将您的视觉效果、您的领域以及实际应用程序的结构和行为视为三个不同的事物。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)