• 架构-MVVM:MVVM核心概念


    ylbtech-架构-MVVM:MVVM核心概念
    1.返回顶部
    1、

    MVVM模式是Model、View、ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM模式是对MVC模式的变种。哪儿变了?我认为MVVM和MVC的主要变化在于MVVM更适合于XAML。

    2011-05-03 14h43_20

    MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处

    1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model不可以不变,当Model变化的时候View也可以不变。

    2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

    3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。

    4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

    mvvm 2011-07-02 15h23_34

    如果用Interface接口来表达,基本就是这么个意思:

    publicinterface IView
    {
     IViewModel ViewModel { get; set; }
    }
     
    publicinterface IViewModel
    {
     IModel Model { get; set; }
     
     ///<summary>
     /// a property that states the controller is busy doing something (like fetching data from a service),
     /// usually the iterface should be blocked
     ///</summary>
     bool IsBusy { get; }
    }

    MVVM_1

    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
    • 2011-07-02 15h21_12

    3. Model

    • 数据和业务逻辑
    • 客户端领域模型
    • 由data entities, business objects, repositories and services构成
    • 可以实现属性或集合的change notification
    • 可以实现validation 接口例如 IDataErrorInfo

    MVVM

    View和ViewModel主要通过数据绑定和Command/Behavior进行交互,如下图所示:

    2011-05-03 10h24_31

    一个例子并且附代码下载(Command未示例)

    https://www.codeproject.com/Articles/126171/MVVM-Silverlight-Simplified

    有关Model(模型)和DTO的问题

    2011-05-03 17h33_31

    前面说的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等等,个人认为不太合适,可以参考这篇文章),此外,参考这篇文章:《WCF RIA Services and a guide to use DTO/”Presentation Model”

    DataFlow

    代码例:

    publicpartialclass MyModelsEntities : ObjectContext
    {
    
    …
    
    }
    
    [EdmEntityTypeAttribute(NamespaceName="MyModels", Name="MyEntity")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    publicpartialclass MyEntity: EntityObject
    {
    
    …
    
    }

    MVVM的实践要点

    1. View分离要彻底,不要有坏味道

    视图(view)部分,xaml.cs 应该只有很少的代码或没有代码,如果你的xaml.cs包含大量的代码,那么很可能你MVVM用的不对头,需要检查其中代码的坏味道。Xaml和xaml.cs 只能包含处理界面、视图、显示样式、视图元素之间的交互、视图元素动画,等等的内容

    2. ViewModel要可测试

    从重构的观点看,如果你的代码中ViewModel是可测试的,有详细的单元测试Unit Test,你的代码是OK的,否则需要检查其中的坏味道。

    MVVM Basic

    2、
    2.返回顶部
     
    3.返回顶部
     
    4.返回顶部
     
    5.返回顶部
     
     
    6.返回顶部
     
    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    如何有效的遍历django的QuerySet
    python进程池剖析(三)
    python进程池剖析(二)
    python进程池剖析(一)
    条件变量signal与unlock的顺序
    智能指针与句柄类(四)
    解析正则 /(d)(?=(d{3})+.)/g
    原生JS实现增加删除class
    RN 热更新
    Windows下搭建IOS开发环境
  • 原文地址:https://www.cnblogs.com/storebook/p/9415587.html
Copyright © 2020-2023  润新知