.NET的MVVM框架

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,可以参考以下资料:

  • Laurent Bugnion 的《Understanding MVVM Pattern》和《Deep Dive MVVM》
  • 微软 Silverlight 组的《Understanding the MVVM Pattern in Silverlight Applications》
  • Erik Lebel 在 InfoQ 上的视频演讲《Presentation Pattern》

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

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

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

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

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

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

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

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

3. 你没有代码隐藏。

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 索引 lt =_MySQL索引相关

MySQL索引采用的是BTREE,多列联合索引是一个有序元组,其中各个元素均为数据表的一列。设一个表有M列,建一个度为n的多列联合索引,深度h lognM,设一组索引列的大小为s,索引文件的大小可以计算为s*M*(1M/nM/…

.NET平台下开源框架

一、AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率。 NKalore是一款编程语言,它扩展…

mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表

DELIMITER $DROP PROCEDURE listAllDB;CREATE PROCEDURE listAllDB()BEGINDECLARE no_more_record INT DEFAULT 0;/*定义2个变量:temp用于记录游标每次next的值,schemaName表示将所有temp拼接后的值*/DECLARE schemaName varchar(500) DEFAULT ;DECLARE …

先进的ASP.NET开源工作流快速开发框架 - RoadFlow

.net可视化工作流引擎RoadFlow - 设计概述 RoadFlow是天知软件旗下基于.NET的工作流快速开发平台,由从事六年以上OA及工作流开发与实施的团队设计开发,该工作流平台已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角…

view [bootstrap-4] not found如何解决_Dubbo如何处理业务异常,这个一定要知道哦

前言我们在开发应用系统时,不可避免的要使用到我们自己定义的异常,所以我们一般通常会用到自定义的业务异常类BusinessException,这个异常会继承extends RuntimeException,当发生业务限制的时候,会throw出来。问题在Sp…

c# 自定义应用程序配置文件(app.config)

1. 向项目添加app.config文件: 右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”&…

python爬取文件归类_python爬取各类文档方法归类汇总

HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法,以备查阅。1.抓取…

.NET(C#)有哪些主流的ORM框架

前言 在以前的一篇文章中,为大家分享了《什么是ORM?为什么用ORM?浅析ORM的使用及利弊》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)还…

android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

开发中给ImageView加载一个高质量图片时,APP抛出了“Canvas: trying to draw too large(840253440bytes) bitmap.”的异常。猜测是图片占用内存太大,超出APP被分配的内存(我用的mate9,APP被分的内存差不多200m),造成了OOM。解决方…

.net开源框架开源类库(整理)

常用库 Json.NET https://github.com/JamesNK/Newtonsoft.Json Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中…

docker jdk mysql_docker部署springboot前后端分离项目(jdk+jar包+mysql+redis+nginx)(示例代码)...

jdk1.8,dockerfile文件1.vim jdk-dockerfile?FROM centos:7MAINTAINER sinvie.cnWORKDIR /usrRUN mkdir /usr/local/javaADD jdk-8u221-linux-x64.tar.gz /usr/local/java/ENV JAVA_HOME /usr/local/java/jdk1.8.0_221ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $J…

matlab连接mysql教程视频_Matlab建立到Oracle数据库的连接

Linux下的配置过程和Windows一样,如下:1、将Oracle JDBC的JAR包拷贝到Matlab的相关目录(..\matlab\java\jar\toolbox\)下。一、Matlab通过ODBC建立到Oracle数据库的连接1、在Windows下“开始”→“控制面板”→“性能和维护”→“管理工具”,…

C# App.config学习

进入公司一年多来&#xff0c;对配置文件添加了不少参数&#xff0c;但是从未想过这些参数是如何被读取出来的&#xff0c;今天把读取参数的处理看了一下&#xff0c;收获不少。假定有App.config如下 <?xml version"1.0" encoding"utf-8" ?> <…

php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行

我正在开发时间表应用程序,并编写PHP代码以提取所有时间表直到日期.这是我为获取时间表而编写的查询-选择a.accnt_name,u.username,DATE_FORMAT(t.in_time,’&#xff05;H&#xff1a;&#xff05;i’)inTime,DATE_FORMAT(t.out_time,’&#xff05;H&#xff1a;&#xff05;…

大数据-----软件开发模型(详细讲解)

大数据学习免费学习资料&#xff08;免费教程&#xff09; 软件工程中&#xff0c;常用的开了模型有四种&#xff1a;瀑布模型、原型模型、增量模型和螺旋模型。 ⒈瀑布模型包括计划&#xff0c;需求分析、设计、编码、测试、运行维护六个阶段&#xff0c;阶段自上而下&#x…

python response[200_python – django上的代码200 httpresponse

我正在进行服务基本登录,我需要在Django视图中回答代码200和JSON,但我不知道这是否是使用HttpResponse库的正确形式&#xff1f;def Login(email,password):UserCUser()if User.is_valid(email,password) :userUser.find(email)datos[Id] str(user[Id])datos[Name] user[Name…

C#中struct和class的区别详解

本文详细分析了C#中struct和class的区别&#xff0c;对于C#初学者来说是有必要加以了解并掌握的。 简单来说&#xff0c;struct是值类型&#xff0c;创建一个struct类型的实例被分配在栈上。class是引用类型&#xff0c;创建一个class类型实例被分配在托管堆上。但struct和cla…

python面向对象编程的语言_怎么使用python面向对象编程

怎么使用python面向对象编程发布时间&#xff1a;2020-08-25 13:42:19来源&#xff1a;亿速云阅读&#xff1a;89作者&#xff1a;Leah本篇文章给大家分享的是有关怎么使用python面向对象编程&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff0c;希望大家阅…

软件测试计划时要记住什么

测试计划是软件测试生命周期的早期阶段之一。良好的计划是平稳执行阶段的关键&#xff0c;而糟糕的计划可能导致不必要的时间消耗。测试用例编写&#xff0c;资源分配等是作为测试计划的一部分执行的一些活动。 在规划过程中应注意并注意一些关键点&#xff0c;以避免将冗余问题…

ssm框架搭建连接mysql_从零开始搭建SSM框架(Spring + Spring MVC + Mybatis)

最近在回顾和总结一些技术&#xff0c;想到了把之前比较火的 SSM 框架重新搭建出来&#xff0c;作为一个小结&#xff0c;同时也希望本文章写出来能对大家有一些帮助和启发&#xff0c;因本人水平有限&#xff0c;难免可能会有一些不对之处&#xff0c;欢迎各位大神拍砖指教&am…