Silverlight入门系列]使用MVVM模式(1):MVVM核心概念
MVVM模式是Model、View、ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM模式是对MVC模式的变种。哪儿变了?我认为MVVM和MVC的主要变化在于MVVM更适合于XAML。
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处:
1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model不可以不变,当Model变化的时候View也可以不变。
2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
如果用Interface接口来表达,基本就是这么个意思:
2 {
3 IViewModel ViewModel { get; set; }
4 }
5
6 public interface IViewModel
7 {
8 IModel Model { get; set; }
9
10 /// <summary>
11 /// a property that states the controller is busy doing something (like fetching data from a service),
12 /// usually the iterface should be blocked
13 /// </summary>
14 bool IsBusy { get; }
15 }
MVVM的Model、View、ViewModel分工
1. View
- 负责界面和显示,界面构成元素有window, controls, page, dataTemplete, custom controls….
- 代码通常有XAML和XAML.CS组成,但后台代码应该很少
- 通过DataContext和ViewModel绑定
- 不直接和Model交互!
- 控件可以和ViewModel的公共属性绑定,update需要双向绑定
- 控件可以触发Behavior/Command调用ViewModel的方法,Command是View到ViewModel的单向通讯 (View中触发事件,ViewModel中处理事件)
2. ViewModel
- 主要包括界面逻辑和模型数据封装,Behavior/Command事件响应,绑定的属性定义等
- ViewModel继承Model类,或者是Model的继承类
- 是view和model的桥梁,是对Model的抽象,例如,model中数据格式是“年月日”,可以在viewModel中转换model中的数据为“日月年”以供视图(view)显示。
- 维护视图状态
- 实现属性或集合的change notification
3. Model
- 数据和业务逻辑
- 客户端领域模型
- 由data entities, business objects, repositories and services构成
- 可以实现属性或集合的change notification
- 可以实现validation 接口例如 IDataErrorInfo
View和ViewModel主要通过数据绑定和Command/Behavior进行交互,如下图所示:
一个例子并且附代码下载(Command未示例)
有关Model(模型)和DTO的问题
前面说的Model是客户端的,但实际上Domail Model存在服务器端(靠近数据库)和那就需要和客户端搞映射DTO(Data Transfer Ojbect,数据传输对象,带序列化标记,用来远程调用)。在Silverlight中有个很方便的东西来实现这个DTO过程和序列化,那就是WCF RIA Service和DomainService。如果你创建一个简单的Silverlight应用并且调用WCF RIA Service,基本上会生成DTO Model: ObjectContext(EntityObject)。(也有人喜欢在Model里面调用RiaSerivce实现load,save等等,个人认为不太合适,可以参考这篇文章)
代码例:
{
…
}
[EdmEntityTypeAttribute(NamespaceName="MyModels", Name="MyEntity")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class MyEntity: EntityObject
{
…
}
MVVM的实践要点
1. View分离要彻底,不要有坏味道
视图(view)部分,xaml.cs 应该只有很少的代码或没有代码,如果你的xaml.cs包含大量的代码,那么很可能你MVVM用的不对头,需要检查其中代码的坏味道。Xaml和xaml.cs 只能包含处理界面、视图、显示样式、视图元素之间的交互、视图元素动画,等等的内容。
2. ViewModel要可测试
从重构的观点看,如果你的代码中ViewModel是可测试的,有详细的单元测试Unit Test,你的代码是OK的,否则需要检查其中的坏味道。
更多MVVM的内容且看下回分解。(附:本例子且附代码下载(Command未示例))
作者:Mainz 出处:http://www.cnblogs.com/Mainz
转载于:https://www.cnblogs.com/jeriffe/articles/2085765.html
Silverlight入门系列]使用MVVM模式(1):MVVM核心概念相关推荐
- Silverlight入门系列]使用MVVM模式
[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制Storyboard动画? (2011-09-07 16:12) [Silverlight入门系列]使用MVVM ...
- [Silverlight入门系列]使用MVVM模式(1):MVVM核心概念
编辑器加载中...MVVM模式是Model.View.ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM模式是对MVC模式的变种.哪儿变了?我认为MVVM和 ...
- 《北风网网友录制Silverlight入门系列视频教程》共23课时/更新完毕[压缩包]
中文名: 北风网网友录制Silverlight入门系列视频教程 资源格式: 压缩包 版本: 共23课时/更新完毕 发行日期: 2012年03月05日 地区: 大陆 对白语言: 普通话 文字语言: 简体 ...
- [Silverlight入门系列]使用MVVM模式(6):使用Behavior
Behavior把一些常用的行为封装成可重复使用的组件(Component),在理想状况下,Designer(设计师)或domain expert(特定领域的专家,例如财会人员.HR人员.或MIS)甚 ...
- [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现
本文说说ViewModel的这个INotifyPropertyChanged接口可以用来做啥? 举例1:我有个TabControl,里面放了很多View,每个由ViewModel控制,我想是想TabS ...
- [Silverlight入门系列]使用MVVM模式(3):Model的INotifyPropertyChanged接口实现
当客户端绑定一个数据模型以后,数据模型变化以后可以自动通知客户端更新界面显示,这就是INotifyPropertyChanged接口要做的工作.INotifyPropertyChanged 接口用于向 ...
- [Silverlight入门系列]实现局部元素全屏(Element部分全屏)
本文不讨论Silverlight全屏模式的实现,有关实现这个,可以参考TerryLee的这篇文章,核心代码就是这行: Application.Current.Host.Content.IsFullSc ...
- [Silverlight入门系列]用TransformToVisual和Transform取得元素绝对位置(Location)
在Silverlight的Layout中,控件往往是相对放置,例如Grid/Border/ListBox等,这个时候就是要取得子控件的绝对位置(location)怎么办?使用场景很多,例如,我们点击一 ...
- [Silverlight入门系列]动态创建控件和绑定
http://www.cnblogs.com/Mainz/archive/2011/10/04/2198924.html 转载于:https://www.cnblogs.com/Ken-Cai/arc ...
最新文章
- 《系统集成项目管理工程师》必背100个知识点-88系统集成项目收尾管理工作
- ListBox的一个郁闷小问题!
- “老师,我不要苹果味的,我要葡萄味的”!
- TensorFlow HOWTO 4.1 多层感知机(分类)
- 少数人知道的公式+思路,财务报表自动生成,财务总监用了5年
- spring boot admin 自定义
- 图书租借管理系统java_阅览室图书租借管理系统下载
- 【友元、异常和其他】——C++ Prime Plus CH15
- 【计算机组成原理——定点数原码一位乘法手算】
- Python 之字典(dict)根据 value 获取 key
- C++ 房贷计算 : 等额本金和等额本息
- VBA打开一个EXCEL文件并在二个文件之间来回操作的代码
- android p屏幕使用时间,MIUI迎来第414周更新,新增屏幕使用时间,小米6获Android P更新!...
- 华为OD机试真题 Python 实现【检测热点字符】【2023 Q1 | 100分】
- mysql 内存 优化_MySQL核心参数优化(内存优化)
- 以太网使用的CSMA/CD协议是以争用方式接入到共享信道的。这与传统的时分复用TDM相比优缺点如何?网络适配器的作用是什么?网络适配器工作在哪一层?假定1km长的CSMA/CD网络的数据率为1Gb/s
- 报表练习题:销售订单打印的相关说明
- 同款蓝牙耳机为什么会串联_蓝牙耳机凭什么成网红明星标配时尚单品?揭秘三大原因...
- SuperScan扫描端口
- 有哪些好用的科研工具软件?
热门文章
- VS2010 调用RFC 时注意(.net4.0) 使用nco
- OpenCV各个模块/各个文件夹的含义
- leetcode算法题--最长湍流子数组
- cmake 版本 arm_尝试使用CMake构建Qt+Pytorch简单应用
- SVN中提交时提示副本被锁定,执行清理时也提示副本被锁定的解决办法
- ValueAnimation 原理分析
- go标准库的学习-fmt
- finally 关键字
- ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签
- 加码IoT生态圈:爱立信携手客户及合作伙伴共筑物联网之梦