深入理解MVVM模式

来源 :速读·下旬 | 被引量 : 0次 | 上传用户:zcsq1987
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:MVVM即Model-View –ViewModel,是微软WPF和Silverlight应用特有的一种界面设计模式。使用MVVM设计模式可以帮助我们分离业务逻辑,显示逻辑和用户界面,使得我们的程序代码结构清晰,容易被阅读、测试、维护、替换、扩展和改进。
  关键词: MVVM;设计模式;分层;用户界面
  一、什么是MVVM模式
  MVVM是Model-View-ViewModel的简写。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……。这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性揉合进去,以应对客户日益复杂的需求变化。
  二、为什么要有MVVM模式
  开发UI,对一个专业软件并不容易。它需要未知数据、交互式设计,可视化设计、联通性,多线程、国际化、验证、单元测试以及其他的一些东西才能完成。考虑到UI要展示开发的系统并且必须满足用户对系统风格不可预知的变更,因此它是很多应用程序最脆弱的地方。
  有很多的设计模式可以帮助解決UI不断变更这头难缠的野兽,但是恰当的分离和描述多个关注点可能很困难。模式越复杂,之后用到的捷径越可能破坏之前正确的努力。
  自从人们开始构建UI时,就有很多流行的设计模式让UI构建更容易。比如,MVP模式在各种UI编程平台中都非常流行。MVP是MVC模式的一种变体,MVC模式已经流行了几十年了。MVVM比MVP更加简单,更不用说MVC了。MVVM是在MVP之后出现的一种“更好的”UI模式解决方案。
  如图1,展现了MVVM是如何做到井然有序的。
  <D:\书\排版\速读·下旬201512\速读排版12下打包10.30\Image\11.jpg>
  图1  MVVM模式图解
  (1)View中很多控件的数据类型和Model中的属性不相同,例如开发中,性别这种,Model中很可能就放置一个bool类型的变量。但是在前台的展现View中,用户看到的应该是“男”和“女”。这就需要一种转化。
  (2)在WPF开发中事件和命令同样都可以让一个UI正常的工作。我们知道Winform是事件驱动的。所以理所当然使用事件更容易理解和实现。但是带来的问题是后期的庞大与多种多样的事件。
  这两种问题很大的催生出Model和View中间的一个辅助角色ViewModel。它需要帮助View转化相应的数据给Model或者从Model处转化成View可以显示的内容。同时它也需要将View的多种命令绑定给Model中的处理方法上。这些命令可以复用,当其他View需要的时候,同样可以调用命令中绑定的方法。ViewModel可以看成一个变种的Controller。
  三、实现原理
  解决了上一节提出的两个问题,实际上就解决了ViewModel的全部工作原理。
  首先,从Binding问题入手。在View中的控件存在一个属性,叫做“DataContext”。这个是控件数据使用的源头。DataContext属性会给控件指定一个后台模型,使得该控件使用的数据都是来自于这个模型类。所以,ViewModel应该充当这个后台模型的作用,给View的控件提供显示数据。同时,ViewModel的数据应该是来自于背后的Model所提供的。所以,简要的说,根据View中显示的数据是何种Model,来定义ViewModel。举个例子,如果View构造了一个TextBlock控件,想要显示的仅仅是Model中的一个string。那么在ViewModel中,应该引用这里的Model,这样作为View部分,就可以调用这个Model的某个string属性了。
  其次,解决Command问题。WPF中已经构建了实现了ICommand的类RoutedCommand和RoutedUICommand。针对于不同的View事件,单独使用哪一种都不是全权之策。因此,需要定义一个实现了ICommand接口的类。目前网上有现成的DelegateCommand和RelayCommand两种解决方法。他们的共同点都是实现了ICommand接口,同时对于不同的事件,都可以绑定Model不同的处理方法。其区别是:i)DelegateCommand使用了一个RaiseCanExecuteChanged方法,需要开发者手动来触发控件可执行判断。而RelayCommand中对于此处的触发判断是代理给CommandManager自己判断了。更加方便;ii)DelegateCommand因为是开发者手动控制的,所以资源占用低,而RelayCommand在各种命令触发的时候都需要判断一下。所以资源占用也相对较高。这一点尤为能体现在复杂的系统中。所以使用哪一个都是看开发人员自己选择。当然也可以自己手动写一些更加适合自己的XXXCommand。其实现原理就是实现了ICommand接口。另外,使用委托的方法,将无返回值的Execute使用Action委托,有返回值的CanExecute使用Func委托。
  参考文献:
  [1]陈明、李猛坤、张强.一种基于扩展MVVM模式的SaaS面向服务计算模型[J].微电子学与计算机,2010年08期
  [2]李猛坤、陈明.一种基于扩展MVVM模式的面向服务软构件模型[J].科学技术与工程,2011年10期
其他文献
假期,我去内蒙古旅游,带团的孔导给我留下了深刻的印象,至今记忆犹新。  他跟我以前见过的导游有些不一样。穿着一件蓝白格子的衬衫和一条简洁的牛仔裤,搭配得干净又耐看。瘦瘦高高的,眼睛不大,却非常有神,鼻子高挺,吐气清爽。整个人看上去文质彬彬的,一点也不像走南闯北的导游。  没想到看着斯斯文文的孔导,竟然歌唱得非常好,而且是用很专业的美声唱法哦!那一回,当我们的旅游车行驶在苍茫草原上,孔导怕我们一路感
期刊
李立国rn2月8日,中共中央纪委对第十八届中央委员,民政部原党组书记、部长李立国和民政部原党组成员、副部长窦玉沛严重失职失责问题立案审查.经查,李立国同志作为民政部党组
期刊
小学语文是一门基础学科,语文学习成效如何,往往影响甚至决定学生其他学科的学习,对每一位语文老师来说,肩上的使命是沉甸甸的,但又是光荣而神圣的。  1.强化目标意识  课堂教学是新课程实施的主渠道、主阵地。学生语文素养的形成与发展,主要是靠在课堂教学中落实“三维目标”,实现学段目标。明确的教学目标是语文课堂教学中发挥学生主体作用的首要条件,因此强化目标意识,是当前语文教学改革的当务之急。  教学目标
历史是一门常教常新的学科,面对异于通史体例的专题式模块内容,更是对教师的“教”和学生的“学”都提出了新的要求。隨着新课程改革的深入开展,新的教学理念和新的教学模式可以说是百花齐放、精彩纷呈,然而,教法陈旧、知识老化、观念僵化的现象在中学历史教学中仍普遍存在。为此,历史教师应切实转变课程观念和教学方法,全面提高教师自身素质,以适应新课改的教学要求和时代发展的需要。就此,本人结合几年来的初中历史教学实
刘某是广西壮族自治区钦州市浦北县寨圩镇一名吸毒人员.今年4月1日17时许,刘某到寨圩镇子厄村委独田村旧矿山鱼塘旁,右手持注射器左手持尖刀恐吓正在钓鱼的倪某华、倪某汉、
期刊
我国高校的思想政治工作需要提升思想认识,正确认识工作环境与工作对象,同时还要注重改善工作方法,并提高队伍建设,正确应对在职能、机制与体制等方面的新机遇与新挑战.
摘 要:职业院校内涵发展本质在于教育质量的提升,而教育质量的提高本质在于教师教学能力的提高。目前,高职院校兼职教师是高职教育的重要组成部分,是教学力量的中坚力量。但是目前,很大一部分兼职教师的教学能力不尽如人意。本文对高职院校兼职教师教学存在的问题进行分析,并提出应对措施,对高职院校兼职教师队伍教学能力的提高有深远的意义。  关键词:高职院校;教育质量;兼职教师  随着社会经济的转型期,职业教育在
期刊
注水井吸水剖面预测对于分层注水调整方案的编制和注采井组水淹状况的确定具有重要的指导意义.历史吸水剖面是目前最准确的计算分层吸水量的资料,但是目前对于该资料的使用并
摘 要: 随着新课标改革的不断深入,小学教育教学形式发生巨大的转变,在小学语文教学中对学生的认知能力提出新的要求,为了达到新课标课程的教学目的,传统教学方法已经无法满足现代教学的需要。因此,要真正提高语文教学水平,培养学生的语文学习能力,必须对教学方法进行调整,实现真正的以学生为课堂主体,按照学生的发展规律及学习规律,探索出适应小学语文教学的教学方法,提高小学语文教学质量。  关键词: 小学语文