AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

.NET 的 MVVM 框架

  • 2011 年 12 月 15 日
  • 本文字数:1572 字

    阅读完需:约 5 分钟

Model-View-ViewModel 是一种架构模式,主要在 WPF、Silverlight 和 WP7 开发里使用,它的目标是从视图层移除几乎所有代码隐藏(code-behind)。交互设计师可以专注于使用 XAML 表达用户体验需求,然后创建和视图模型的绑定,而视图模型则是由应用程序开发者开发和维护的。

MVVM 是更加通用的 Presentation 模式的一个具体实现。MVVM 视图模型包含概念模型而不是数据模型,所有业务逻辑和其它操作都是在模型和视图模型里完成的。有很多框架可以做到这点,其中一些是:

开源的

  • PRISM :由微软提供,和 MEF/Unity 一起用于依赖注入,支持组合命令,可以扩展 MSDN 上有详细的教程和演练。
  • MVVM Light Toolkit :有 visual Studio 和 Expression Blend 的项目和项的模板。更多信息请看这里,另外可以参考 VS Expression Blend 的使用教程。
  • Caliburn Micro :支持视图模型先行(ViewModel-First)和视图先行(View-First)两种开发方式,通过 co-routine 支持异步编程。
  • Simple MVVM Toolkit :提供 VS 项目和项的模板,依赖注入,支持深拷贝以及模型和视图模型之间的属性关联。
  • Catel :包含项目和项的模板,用户控件和企业类库。支持动态视图模型注入,视图模型的延迟加载和验证。还支持 WP7 专用的视图模型服务。

闭源的

  • Intersoft ClientUI :付费的,只支持 WPF 和 Silverlight,但是,除了 MVVM 框架,它还提供其它一些特性
  • Vidyano :免费但不开源。带有实体映射 / 虚拟持久化对象(数据容器),业务规则以及内置基于 ACL 的安全特性。

若想了解 MVVM,可以参考以下资料:

使用 MVVM 的最大好处之一是分离关注点,以便用户体验设计师和应用程序开发者可以并行工作。另一方面,相关的担忧包括它对于 UI 操作比较简单的情况有点杀鸡用牛刀的感觉,数据绑定有点难以调试,以及大量使用数据绑定可能带来性能问题等等。


Jonathan Allen 在评论里提到几点错误使用 MVVM 的征兆:

1. 你的模型和视图模型名字相同。

视图模型不应该是对模型的包装。视图模型的职责是外部服务的请求中介,比如加载和保存数据。而数据本身,以及验证和大多数业务逻辑应该放在模型里。

我经常强调这点。每当你创建一个视图模型包装一个模型,你就在你的 API 里引入一个巨大漏洞。具体地,任何直接引用这个模型的东西都可能以视图模型无法察觉的方式改变某个属性,因此 UI 也不会有相应的改变。同样地,模型里计算字段的任何更改也不会回传给视图模型。

2. 你的视图和视图模型名字相同。

理想的情况下,视图模型是不知道使用它们的视图的,尤其是 WPF 应用程序有多个窗口共享相同的视图模型。

对于比较小型的应用程序来说,整个应用程序可能只需一个视图模型。对于比较大型的应用程序来说,主要功能可能需要一个视图模型,每个次要方面也需要一个,比如配置管理。

3. 你没有代码隐藏。

代码隐藏既非一个好的东西,亦非一个坏的东西。它只是一个用来放置和视图或控件相关的逻辑的地方。因此,当我看到一个视图没有任何代码隐藏,我就会马上检查是否存在以下问题:

  • 视图模型是否通过名字接触了特定的控件?
  • 视图模型是否通过命令参数访问控件?
  • 是否使用了 EventToCommand 或其它可以导致泄露的行为而不是简单的事件处理程序?

MVVM Light 的 EventToCommand 很有问题,因为它会使得控件从屏幕移除之后无法被垃圾回收。

4. 视图模型监听属性更改通知

如果一个模型的的生命周期比监听它的事件的视图模型长,那么可能导致内存泄露。不同于视图有个 Unloaded 事件,视图模型对于生命周期管理没有很好的方案。因此如果它们关联到存活期比它们更长的视图模型的事件,视图模型将会出现泄露。

查看英文原文: MVVM Frameworks For .NET

2011 年 12 月 15 日 18:1816078

评论

发布
暂无评论
发现更多内容

第六周总结

石刻掌纹

面试官:如何决定使用 HashMap 还是 TreeMap?

爱嘤嘤嘤斯坦

Java 算法 hashmap

为什么我们应该使用 Flutter?

环信

flutter

MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)

海星

Java MySQL 面试

静态代码检查完成代码分析和SonarQuber的初探

陈磊@Criss

海南七星彩网站源码结算功能开发

网站,小程序,APP开发定制

实战技巧,Vue原来还可以这样写

前端有的玩

Java Vue 前端 技巧

计算机网络基础(二)---网络层-IP协议详解

书旅

php laravel 计算机网络 网络协议

从需求到交付——论敏捷过程中的需求管理

华为云开发者社区

敏捷开发 团队协作 需求管理 故事 持续交付

【面试题系列】——Java基础

Noneplus

Java

MySQL性能优化(三):深入理解索引的这点事

xcbeyond

MySQL 索引 MySQL性能优化

啃碎并发(11):内存模型之重排序

猿灯塔

从一盏路灯,看亿万级联接的智能之路

华为云开发者社区

人工智能 物联网 智能设备 华为云

Doris 临时失效处理过程

石刻掌纹

文档写作利器:Markdown

xcbeyond

markdown

腾讯的区块链为何败给了老干妈的“萝卜章”?

ToB行业头条

“Python的单例模式有四种写法,你知道么?”——孔乙己

BigYoung

Python 设计模式 单例模式

架构师训练营作业 -- Week 6

吴炳华

极客大学架构师训练营

MySQL性能优化(一):MySQL架构与核心问题

xcbeyond

MySQL MySQL性能优化

震惊!ConcurrentHashMap里面也有死循环,作者留下的“彩蛋”了解一下?

why技术

Java 源码 jdk 后端 bug

一致性协议算法

张瑞浩

doris临时故障恢复过程时序图

刘志刚

【进收藏夹吃灰系列】——Java基础快速扫盲

Noneplus

Java

MySQL性能优化(五):为什么查询速度这么慢

xcbeyond

MySQL 查询优化 MySQL性能优化

未来的智慧城市:未来的城市生活愿景

网站,小程序,APP开发定制

从0开始设计Flutter独立APP | 第三篇: 一劳永逸解决全局BuildContext问题

渔子长

flutter 前端 跨平台 React

MySQL性能优化(二):选择优化的数据类型

xcbeyond

MySQL性能优化

API接口设计最佳实践

Man

Java 安全开发 设计实践 APi设计 接口管理

Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)

YourBatman

spring springboot @Configuration 白嫖

MySQL性能优化(四):如何高效正确的使用索引

xcbeyond

MySQL 索引 MySQL性能优化

SaaS是「包治百病」的良药吗?

ToB行业头条

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

.NET的MVVM框架-InfoQ