zoukankan      html  css  js  c++  java
  • MVVM3

    MVVM设计模式  

    2010-09-19 23:59:18|  分类: MVVM |  标签:mvvm  silverlight4  mvc  mvp  command  |举报|字号 订阅

     
     
     

    一、背景:与用户界面 (UI) 相关的最大的问题就是大量的凌乱的代码,原因两个:

    (1)  用户界面包含负责的逻辑用于维护界面相关对象;

    (2)      其次也包含了应用程序状态的维护。

    用户界面的3大问题:状态 (State) , 逻辑 (Logic) ,同步 (Synchronization),其中状态是用户界面最关心的问题之一。

    二、简述MVC、MVP、MVVM

    (1)     MVC:模型-视图-控制器(Model View Controller),它强制性的使应用程序的输入、处理和输出分开。

    (2)    MVP:模型-视图-表现类(Model-View-Presenter)

    (3)    MVVM:模型-视图-视图模型(Model-View-ViewModel)

    三、比较

    (1)    发展过程:MVC->MVP->MVVM

    (2)    MVC->MVP

    MVC中Model不是纯Model,因为它要有View的一些数据结构。

    MVVM设计模式 - 自由飞翔 - 冰冰的家

     

     

     

    (3)  MVC、MVP->MVVM

     

    View没有大量代码逻辑。结合WPF、Silverlight绑定机制,MVP演变出了MVVM,充分利用了WPF、Silverlight的优势,将大量代码逻辑、状态转到ViewModel,可以说MVVM是专门为WPF、Silverlight打造的。

     

    MVVM设计模式 - 自由飞翔 - 冰冰的家

    (4)用户界面问题比较

     

     

    MVC

    MVP

    MVVM

     

    V

    C

    V

    P

    V

    VM

    状态

     

     

     

    逻辑

     

     

     

    同步

     

     

     

     

    四、MVVM

    (1) 组成部分Model、View、ViewModel

    (a)  View:UI界面

    (b) ViewModel:它是View的抽象,负责View与Model之间信息转换,将View的Command传送到Model;

    (c)     Model:数据访问层

    MVVM设计模式 - 自由飞翔 - 冰冰的家

     (2)  View与ViewModule连接:

    (a)     Binding Data:实现数据的传递

    (b)      Command:实现操作的调用

    (c)      AttachBehavior:实现控件加载过程中的操作

     

    MVVM设计模式 - 自由飞翔 - 冰冰的家

     

     

    Binding和Command可以写在XAML中。

    (3)  优势

    (a)     ViewModule易于单元测试;

    (b)     View没有MVC、MVP复杂的代码逻辑,让整个开发过程中的UI设计和后台的代码编写完全分开,设计者可以专注于使用Express Blend等去设计页面也就是View,而开发的可以完全通过Model来定义要操作的object,通过ViewModel来定义出来需要对这些model做哪些操作,最后使用Command来把Model和View完全联系到一起。

    (4)    不足

    (a)     编写Command的任务重;

    (b)     由于Silverlight不能引用非Silverlight项目,许多界面层的逻辑也得放到后台(非ViewModel部分),如Command实现,必须通过WCF通信调用服务。

    (5)    ICommand

    (a)    编写每一个需要绑定的Command

    (b)     网上有写好的基于WPF的Command模板,利用Prism特性重用这部分。

    (c)     直接利用Prism的DelegateCommand和CompositeCommand类

              DelegateCommand接受Delegate参数

              CompositeCommand可以将多个Command组合在一起。

     

    MVVM设计模式 - 自由飞翔 - 冰冰的家

     

     

    注:Prism 是微软最佳实践,可以简化建设WPF和Silverlight应用。

    (6)     Command原理

    MVVM设计模式 - 自由飞翔 - 冰冰的家

     

     

    (7)AttachBehavior

    (a) 背景

    假设我们有一个Button, 当该Button被点击的时候我们要完成一些操作, 很简单, 将该操作封装成一个Command并绑定到该Button上就可以了, 但如果我们要在Button被Load的时候执行另外一些操作呢?  由于Button没有直接被Load事件所触发的Command, 所以不能使用Command了. 不能直接将Load事件处理器写在Button所在的xaml所对应的CS文件里, 这和我们刚才对MVVM的设计是相矛盾的. 一个不太好的方案是继承一下Button, 并撰写一个由Load所触发的Command, 这可行, 但明显不好. 正如一个控件没有某个属性并且在不继承的情况下而采用AttachProperty一样, 我们可以采用AttachBehavior.    

    五、MVVM具体应用

     

    (1)     Command工作流程:

    主要使用Prism的DelegeCommand、CompositeCommand类与订阅、发布原理。

    (a)       ViewModel初始化命令(ICommand)

    public DelegateCommand<object> AddAdministorCommand { get; private set; }

    this.AddAdministorCommand = new DelegateCommand<object>(this.AddAdministor);

    (b)     View UI元素绑定ViewModel Command属性

    Command="{Binding Path=AddAdministorCommand}"

    (c)     在ViewModel中定义一个事件(event),实现CompositePresentationEvent<object>接口(object-传递参数)。

    public class AdministorRequestEvent: CompositePresentationEvent<AdministorViewModel>

    { }

    (d)     使用TheAggregator订阅一个事件的执行者(Action)

    this.TheAggregator.GetEvent<AdministorRequestEvent>().Subscribe(ShowAdministorVie        w);

            public void ShowAdministorView(AdministorViewModel administorVM)

    {

                AdministorView administorV = new AdministorView();

                administorV.ViewDataContext = administorVM;

                administorV.Show();

               }

    (e)    使用发布一个事件

    private void AddAdministor(object obj)

    {

    this.TheAggregator.GetEvent<AdministorRequestEvent>().Publish( new AdministorViewModel(Administor.CreateNewAdministor(),_administorRepository));

    }

  • 相关阅读:
    docker的应用部署
    docker容器的数据卷
    找到最终的安全状态 深搜
    park和unpark方法详解
    docker容器相关命令
    docker鏡像相關命令
    join方法底层实现
    Elasticsearch启动过程错误汇总
    MySQL 8.0.12 报错The table does not comply with the requirements by an external plugin. (errno 3098)
    docker login 密码查看和加密保存
  • 原文地址:https://www.cnblogs.com/changbaishan/p/3732533.html
Copyright © 2011-2022 走看看