`

对Mvvm模式的理解及框架介绍

    博客分类:
  • Ajax
阅读更多

       使用WPF+Mvvm开发一年多,期间由于对Mvvm模式的理解不足,遇到了很多问题,也绕了很多弯子;网上提供的Mvvm的示例比较简单,实际项目中的需求也各种各样。
不过经过几个项目,也有了一些对Mvvm模式的理解:

1. Mvvm是什么,Mvvm是怎么来的?
Mvvm模式广泛应用在WPF项目开发中,使用此模式可以把UI和业务逻辑分离开,使UI设计人员和业务逻辑人员能够分工明确。

Mvvm模式是根据MVP模式来的,可以简单的说,Mvvm模式就是WPF版的MVP模式。MVP模式,MVC模式,这几个模式都是为了抽离出UI逻辑和业务逻辑。

 

2. 使用Mvvm模式可以参考的主流框架及简单介绍。
主流开源框架:Simple Mvvm,Mvvm Light和Prism。
Simple Mvvm和Mvvm Light基本一致,都是对Mvvm模式的基础封装,并加入了一些不错的功能,消息传输机制,依赖注入等等。开发中小项目推荐使用这两个的其中一个。
Prism是微软给出的一个Mvvm框架,不过它的关注点不仅仅是Mvvm模式,我觉得主要是模块的思想更多一些。大项目的话才推荐使用这个框架,比如一个系统需要分为N个团队进行不同模块的开发,然后再组织成一个系统。 

3. 使用Mvvm模式的思想分析问题。
现在有一个功能:用户填入姓名,年龄,选择最喜欢的颜色,然后点击确定按钮提交。就是这样简单的一个调查表。
a.首先设计UI,UI看起来可能是这样的:


b.根据UI去设计对应的ViewModel需要那些属性,数据和命令:

 Name:string
 Age:int
 FavoriteColor:string
 Submit:Command


c.在ViewModel的SubmitCommand命令中,调用Model的Submit方法进行逻辑处理。Model看起来可能是这样的:

 public string Name { get; set; }
 public int Age { get; set; }
 public string FavoriteColor { get; set; }
 public void Submit() { ... }


4. 看到的一些对Mvvm模式的看法,觉得不太正确。
a.Code-Behind文件要保证绝对干净。
这个说法有些太绝对了,理想状态下,View层的Code-Behind文件中只有在构造函数中调用初始UI元素的一行代码及设置View的DataContext为对于的ViewModel
其实,Code-Behind中还可以些一些UI的逻辑的,比如一些丰富的动画效果,或者直接设置某个元素的样式等。
不过,Code-Behind中确实是不可以写业务逻辑的。
b.ViewModel不能是Model的简单封装,ViewModel也不能是View的简单映射。ViewModel层和View层要绝对分离,ViewModel层要和View一样去面向需求设计。
我觉得这样做有点太过了。
Mvvm的目的只是为了UI逻辑和业务逻辑的分离,你说业务逻辑和数据要写在哪一层呢?没错,Model层。
ViewModel层的主要责任是表现逻辑和状态,即ViewModel层是连接View层和Model层的。Model层的一些业务逻辑的状态是需要通过ViewModel层暴露给View层来反映给软件使用者的。 

5.我对WPF+Mvvm模式开发的一些经验。
a.WPF的几个重要概念要熟练理解和运用:模板,依赖属性,数据绑定。和Mvvm模式的结合使用,能发挥出很好的效果。
b.团队中的成员最好能够对Mvvm模式有统一的理解和认识。
c.Mvvm模式只是一个模式而已,不是有了Mvvm模式就能写出优美的代码,涉及到具体的业务逻辑,还是需要你以及你的团队有足够强的设计能力。

6.vue.js介绍

vue的核心:修改数据(model),html节点就会自动更新

(1)绑定数据:

Js代码   收藏代码
  1. var vm;  
  2.         var count=1;  
  3.         $(function () {  
  4.             vm=new Vue({  
  5.                 el: '#demo',  
  6.                 data: {  
  7.                     message: 'Hello World!',  
  8.                     number: 2,  
  9.                     ok:true,  
  10.                     name:'whuang'  
  11.                 }  
  12.             });  
  13.             vm.$watch('data'function (newVal, oldVal) {  
  14.                 console.log('$watch');  
  15.             })  
  16.         });  

 html代码:

Html代码   收藏代码
  1. <div id="demo">  
  2.     {{ message }}<br>  
  3.     {{ number + 1 }}<br>  
  4.     {{ ok ? 'YES' : 'NO' }}<br>  
  5.     {{ message.split('').reverse().join('') }}<br>  
  6.     {{ name | uppercase }}  
  7.     <hr>  
  8.     <input type="button" class="{{ ok ? 'cls1' : 'cls2' }}" value="更新数据" onclick="updateData2()" >  
  9. </div>  

 

 

(2)动态更新数据

Js代码   收藏代码
  1. var updateData2= function () {  
  2.            vm.$data.message="更新后的数据"+(count++);  
  3.            vm.$data.ok=false;  
  4.        };  

 如何获取vue的data?

 

注意:data前面要加$

 

(3)vue表达式 

Html代码   收藏代码
  1. {{ number + 1 }}<br>  
  2.     {{ ok ? 'YES' : 'NO' }}<br>  
  3.     {{ message.split('').reverse().join('') }}<br>  
  4.     {{ name | uppercase }}  

 

动态修改样式:

Html代码   收藏代码
  1. <input type="button" class="{{ ok ? 'cls1' : 'cls2' }}" value="更新数据" onclick="updateData2()" >  

 在js方法中修改ok的值即可

(4)vue计算属性

Js代码   收藏代码
  1. var vm = new Vue({  
  2.                 el: '#example',  
  3.                 data: {  
  4.                     a: 1  
  5.                 },  
  6.                 computed: {  
  7.                     // 一个计算属性的 getter  
  8.                     b: function () {  
  9.                         // `this` 指向 vm 实例  
  10.                         return this.a + 1  
  11.                     },  
  12.                     upper: function () {  
  13.                         return "<span style='color:red' >school</span>".toUpperCase();  
  14.                     },  
  15.                     haha: function () {  
  16.                         return 'iloveyou'.split('');  
  17.                     }  
  18.                 }  
  19.             })  

 html代码:

Html代码   收藏代码
  1. <div id="example">  
  2.     a={{ a }}, b={{ b }}<br>  
  3.     {{{ upper }}}<br>  
  4.     {{ haha }}<br>  
  5. </div>  

 

(5)监听数据的变化



 执行结果:

new:更新后的数据1;old:Hello World!

 

(6)如何获取vue的节点和数据

节点:vm.$el

数据:vm.$data


各位大牛如有不同的观点可以一起讨论下。作者:backslash112 出处:http://sirkevin.cnblogs.com/ 

分享到:
评论

相关推荐

    Android mvvm 框架,最流行的mvvm demo

    MVVM模式源于微软的WPF开发,近年来在Android开发中逐渐流行,它通过解耦视图(View)和业务逻辑(ViewModel),使代码更易于测试和维护。在MVVM架构中: 1. **Model**:模型层,负责处理数据和业务逻辑,通常包括...

    WPF / Mvvm模式及MVC模式示例

    **WPF/Mvvm模式及MVC模式示例** 在软件开发中,选择合适的架构模式对于项目的可维护性和扩展性至关重要。本示例将探讨两种常用的设计模式:Model-View-ViewModel (MVVM) 和 Model-View-Controller (MVC),它们在C# ...

    WPF,MVVM设计模式框架

    **MVVM模式介绍** Model-View-ViewModel(MVVM)是一种软件设计模式,特别适合于WPF应用。在MVVM中,视图(View)负责显示用户界面,模型(Model)代表业务逻辑和数据,而视图模型(ViewModel)作为两者之间的桥梁,...

    MVVM模式的深入理解与应用

    ### MVVM模式的深入理解与应用 #### 一、MVVM模式概述 MVVM模式,全称为Model-View-ViewModel,是一种广泛应用于现代GUI应用程序设计的软件架构模式。随着Microsoft WPF(Windows Presentation Foundation)技术的...

    MVVM案例Demo示例

    许多UI框架提供了对MVVM模式的内置支持,如Microsoft的WPF和UWP框架中的MVVM Light,以及前端框架如Angular的NgRx,React的Redux或MobX。这些框架提供了诸如依赖注入、数据绑定、路由、状态管理等工具,简化了MVVM的...

    MVVM开发模式例子

    在"MVVMShell"这个例子中,我们可以预期它是一个基础的MVVM框架示例,可能包含了各种MVVM模式的应用场景,如数据绑定、命令的使用、以及如何组织模型、视图和视图模型。这个项目可以帮助开发者理解MVVM架构的组成...

    WPF-MVVM WPF MVVM模式开发的例子程序

    这个例子程序旨在帮助开发者理解和实践WPF中的MVVM模式。 MVVM模式的核心理念是将应用程序分为三个主要部分:模型(Model)、视图(View)和视图模型(ViewModel)。模型负责业务逻辑和数据管理,视图负责用户界面...

    WPF 轻量级 MVVM 框架入门 2.1.2

    理解并熟练运用MVVM模式和相关工具,能够更好地应对大型项目的需求变更和维护挑战。 尽管压缩包文件名"FearpeasuheCekawterjiBispiKiswem"看起来与本文主题无关,但在这个上下文中,我们可以假设它可能包含了这个轻...

    cpp-Sombra是一款基于C的现代化面向Linux的MVVM模式的Web开发框架

    在深入理解Sombra之前,我们首先需要对C++和MVVM模式有基本的了解。 C++是一种强类型、静态类型的编程语言,以其性能高效、灵活性高而著称。它支持面向对象编程,同时提供了模板、STL(Standard Template Library)...

    WPF MVVMLight框架使用源码,可运行看效果

    1. **MVVM模式介绍** MVVM模式是一种软件设计模式,它将业务逻辑(ViewModel)与用户界面(View)分离,通过数据绑定(Data Binding)将两者紧密联系起来。Model层负责处理数据和业务逻辑,ViewModel作为Model和...

    MVVM框架的demo

    **MVVM 框架详解** MVVM(Model-View-ViewModel)框架是现代软件开发中的一个重要概念,尤其在移动应用...通过学习和分析这个示例,开发者可以更深入地理解MVVM框架的运用,从而在实际项目中提升开发效率和代码质量。

    iOS MVVM设计模式

    在MVVM模式下,ViewModel通常负责网络请求。对AFNetworking进行二次封装,可以创建一个网络服务层,提供更简洁、易用的API,如GET、POST请求接口,以及处理网络错误、缓存策略等。这有助于保持代码的整洁,同时也...

    基于Prism框架的MVVM设计模式的WPF实例代码

    **Prism框架与MVVM设计模式** 在软件开发领域,特别是Windows Presentation ...通过深入研究这个实例代码,开发者不仅能掌握Prism框架的使用,还能对MVVM设计模式有更深入的理解,提升开发大型WPF应用程序的能力。

    WPF MVVM整套框架+Socket+SQL+ADO+开源代码

    此项目的开源特性意味着开发者可以查看和学习源代码,理解如何在 WPF 中集成 MVVM 模式、Socket 通信以及数据库操作。这有助于提升开发者的技能,同时也可以借鉴和扩展现有的功能。 总结,这个 WPF 示例项目是一个...

    一步一个脚印实现一个自己的简易MVVM框架

    通过阅读和学习这个项目,你将能深入理解MVVM模式的工作原理,并且能够动手实践,构建自己的框架,这对于提升你的JavaScript开发技能和理解现代前端框架非常有帮助。 总之,实现一个简易的MVVM框架是一个很好的学习...

    WPF简单计算器 MVVM模式

    **WPF简单计算器 MVVM模式** 本项目是一个基于Windows Presentation Foundation (WPF)设计的简单计算器,采用Model-View-ViewModel (MVVM)设计模式。MVVM是一种在XAML环境中非常流行的开发模式,它将业务逻辑、用户...

    WPF之MVVM框架实例

    1. **代码分离**:MVVM模式使得界面设计和业务逻辑可以独立进行,使得开发者和设计师可以同时工作,提高效率。 2. **可测试性**:ViewModel通常不依赖于具体的UI,因此更容易编写单元测试。 3. **灵活性**:由于数据...

    MVVM开发模式DEMO

    MVVM(Model-View-ViewModel)是一种软件设计模式,尤其在UI开发中广泛采用,它在C#编程中尤其常见,特别是在WPF和UWP应用中。MVVM模式旨在提高应用的可...这个DEMO将帮助你深入理解MVVM模式,并能应用于实际项目中。

    WPF使用MVVMLight框架写的Demo软件

    总结起来,`WPF使用MVVMLight框架写的Demo软件`是一个展示如何在WPF项目中运用MVVMLight框架的实例,包括MVVM模式的实现、命令系统、用户控件的使用以及跨ViewModel通信。这些知识点对于理解和掌握WPF应用的开发具有...

Global site tag (gtag.js) - Google Analytics