`

MVVM

 
阅读更多

简单的说:MVVM实际上是三层架构,M层(Model实体层)、V层(View表示层,它有DataContext属性,这个属性可以使用DataTemplate模板绑定VM层的数据用来显示)、VM层(ViewModel层,对Model层进行CRUD进行操作,同时对V层提供数据绑定)

 

  • 采用mvvm的好处:项目可测试更高,从而可以执行单元测试;将UI和业务的设计完全分开,View和UnitTest只是ViewModel的两个不同形式的消费者
  • Model的职责:主要提供基础实体的属性以及每个属性的验证逻辑;不包含数据的调用;不依赖于任何项目。
  • ViewModel:

ViewModel是MVVM架构中最重要的部分,ViewModel中包含属性,命令,方法,事件,属性验证等逻辑。为了与View以及Model更好的交互来满足MVVM架构,ViewModel的设计需要注意一些事项或者约束:

    ViewModel的属性:ViewModel的属性是View数据的来源。这些属性可由三部分组成:

     一部分是Model的复制属性。

    另一部分用于控制UI状态。例如一个弹出窗口的控件可能有一个IsClose的属性,当操作完成时可以通过这个属性更改通知View做相应的UI变换或者后面提到的事件通知。

    第三部分是一些方法的参数,可以将这些方法的参数设置成相应的属性绑定到View中的某个控件,然后在执行方法的时候获取这些属性,所以一般方法不含参数。

     ViewModel的命令:ViewModel中的命令用于接受View的用户输入,并做相应的处理。我们也可以通过方法实现相同的功能。

     ViewModel的事件: ViewModel中的事件主要用来通知View做相应的UI变换。它一般在一个处理完成之后触发,随后需要View做出相应的非业务的操作。所以一般ViewModel中的事件的订阅者只是View,除非其他自定义的非View类之间的交互。

     ViewModel的方法:有些事件是没有直接提供命令调用的,如自定义的事件。这时候我们可以通过CallMethodAction来调用ViewModel中的方法来完成相应的操作。

 

 

View Model一般有以下三个部分组成

  1、属性:一个事物,它的类型可以是一个字符型,也可以是一个对象。实现接口INotifyPropertyChanged,那么任何UI元素绑定到这个属性,不管这个属性什么时候改变都能自动和UI层交互。

  2、集合:事物的集合,它的类型一般是ObservableCollection,因此,任何UI元素绑定到它,不管这个集合什么时候改变,都可以自动的与UI交互。

  3、Commands:一个可以被触发的事件,并且可以传递一个类型为Object的参数。但是前提是要实现接口ICommand。

 

主要有以下三个部分组成

  1、把View Model层的属性绑定到 text box, radio button, toggle button, MediaElement, trigger an animation or ViewState change

  2、把View Model层的集合绑定到ListBox,TreeView,DataGrid

  3、Commands

  使用InvokeCommandAction实现以下behavior

  A、绑定View Model层的ICommand

  B、指出你需要实现的ICommand(比如Click事件,Selected事件。。。)

  C、传递参数

 

 

 

 

 

 

 

 

 

MVVM的简单实例

XAML代码

<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"       
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
         xmlns:cl="clr-namespace:System.Collections;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450">
       <StackPanel>
        <TextBox Text="{Binding Path=Name}"></TextBox>
        <TextBox Text="{Binding Path=Age}"></TextBox>
        <Button Command="{Binding Path=AddAge}" >Add Age</Button>
    </StackPanel>
</Window>

 

MainPageViewModel

 public class MainPageViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string name;
        public string Name {
            get { return name; }
            set {
                name = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }

        private int age;
        public int Age {
            get { return age; }
            set
            {
                age = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));
                }
            }
        }

        public ICommand AddAge
        {
            get { return new AddAgeCommand(this); }
        }

    }

 

 public class AddAgeCommand : ICommand
    {
        private MainPageViewModel mMainPageViewModel;
        public AddAgeCommand(MainPageViewModel model)
        {
            mMainPageViewModel = model;
        }

        public bool CanExecute(object parameter)
        {
            return true;
           
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            this.mMainPageViewModel.Age += 1;
        }
    }

 

我们可以看一下后台只有很少代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainPageViewModel mainPageViewModel = new MainPageViewModel { Age = 20, Name = "Jack" };
            this.DataContext = mainPageViewModel;
        }      
    }

分享到:
评论
1 楼 谁说我不是会员 2013-05-26  
看不太懂,收藏下来慢慢看

相关推荐

    lua实现cocos2d-x的mvvm框架

    MVVM源于MVC(Model-View-Controller)模式,期间还演化出MVP(Model-View-Presenter)模式。MVVM的出现促进了GUI前端开发和后端开发逻辑的分离,提高了前端开发效率。 MVVM的核心是数据驱动即ViewModel,ViewModel是...

    Android mvvm 框架,最流行的mvvm demo

    Android mvvm 框架,最流行的mvvm demo 无bug

    用MVVM架构实现的计算器小程序实例,供WPF和MVVM初学者参考.

    用MVVM架构实现的计算器小程序实例, 包括MVVM架构的命令对象和消息通知对象,小计算器加减乘除的实现逻辑.页面布局等简单知识.供WPF和MVVM初学者参考. 参考代码: /// /// 加法命令 /// public BaseCommand Add...

    基于MvvmLight的MVVM程序内附详细说明.7z

    一个 基于 MVVM LIGHT程序实例,内附详细的教程。包括1.1 MVVM Light Toolkit下载,安装 目录 1 MVVM Light的安装 1 1.1 MVVM Light Toolkit下载 1 1.2 MVVM Light Toolkit安装 2 2 程序实例 3 2.1 建立工程文件 3 ...

    MVVM案例Demo示例

    MVVM案例Demo示例

    WPF实现MVVM的事件绑定

    WPF实现MVVM的事件绑定的两种非常规方式。 参考博客:https://blog.csdn.net/IQQQQU/article/details/86530285 1、重写InvokeCommandAction来扩充返回的参数 2、运用Behavior来实现事件,可以通过两种方式来获取...

    TypeScript accomplish MVVM pattern(TypeScript实现MVVM)

    使用TypeScript创建MVVM框架模型,以此来开发大型的windows应用商店程序或者其它web程序。 Use TypeScript to accomplish MVVM pattern to develop windows store app or other web application.

    MVVM Demo for WPF

    I tend to see alot of people who fail to exploit the benefits of DataBinding in WPF, and not enough people are aware of the benefits of the MVVM pattern, which will be the main purpose of this lesson...

    MVVM模式模型-视图-视图模型(Model-View-ViewModel)

    结合WPF、Silverlight绑定机制,MVP演变出了MVVM,充分利用了WPF、Silverlight的优势,将大量代码逻辑、状态转到ViewModel, 可以说MVVM是专门为WPF、Silverlight打造的。 View绑定到ViewModel,然后执行一些命令在...

    WPF MVVM DataGrid分页案例

    WPF MVVM DataGrid分页案例 运用数据绑定 Command 可作为MVVM学习使用

    MVVM模式结合MVVMlight框架的应用

    MVVM模式结合MVVMlight框架的应用 程序=数据结构+算法 面向对象=对象+对象之间关系 1.以数据为中心的开发方式。 1)Model:定义一个数据结构。 关键代码:实现接口INotifyPropertyChanged 2)ViewModel:定义算法...

    MVVM in Delphi: Architecting and Building Model View ViewModel Applications

    "MVVM in Delphi: Architecting and Building Model View ViewModel Applications" 2016 | ISBN-10: 148422213X | 143 pages | PDF, EPUB | 23 MB Dive into the world of MVVM, learn how to build modern ...

    Prism MVVM应用 登陆后切换主窗体实现

     使用Prism7开发WPF程序,编码采用MVVM形式。当程序启动时,首先进入一个登陆界面,进行登陆认证,认证成功后转入程序布局主窗口。 设计思路  WPF程序框架搭建后,程序中存一个Shell.xaml,相当于表演者的唯一...

    MVVM在Winform应用实例

    MVVM在Winform应用实例,simpleButton1点击后,再点击simpleButton2显示textEdit1的值

    Mvvm增删改查

    基于mvvmLight框架下得增删改查demo,是对mvvm开发模式的一次入门介绍,方便新人快速上手,父页面与子页面通过委托来进行数据的传递。

    Android开发基于MVVM模型设计的BeatBox程序源码.zip

    Android开发基于MVVM模型设计的BeatBox程序源码Android开发基于MVVM模型设计的BeatBox程序源码Android开发基于MVVM模型设计的BeatBox程序源码Android开发基于MVVM模型设计的BeatBox程序源码Android开发基于MVVM模型...

    WPF-MVVM编程

    本项目使用WPF的mvvm设计模式编写,使用SQLite保存数据。希望对学习wpf的童鞋有帮助。 我也是刚刚上手的,写的不要勿怪,大神略过。

    MVVM light小实例

    MVVMLight silverlight 的一个小实例

    WPF MVVM 模式使用DataGrid

    利用微软的MVVM开发模式,方便高效的使用DataGrid控件实现功能。

    WPF+Mvvmlight 简单的导航实例

    WPF+Mvvmlight 简单的导航实例

Global site tag (gtag.js) - Google Analytics