`

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  
看不太懂,收藏下来慢慢看

相关推荐

    MVVM(GalaSoft.MvvmLight)简单小项目和其它MVVM框架(CommunityToolkit.Mvvm)

    MVVM(Model-View-ViewModel)是一种软件架构设计模式,它是实现视图和模型分离的一种方式,广泛应用于现代桌面应用程序和移动应用程序中。MVVM模式由微软的一些开发者提出,旨在简化基于Windows Presentation ...

    Android mvvm 框架,最流行的mvvm demo

    在Android开发领域,MVVM(Model-View-ViewModel)架构模式已经成为了现代应用程序设计的主流选择。本项目“Android mvvm 框架,最流行的mvvm demo”旨在提供一个无bug的示例,帮助开发者深入理解并实践MVVM框架在...

    MVVM案例Demo示例

    **MVVM模式详解** MVVM(Model-View-ViewModel)是一种软件设计模式,广泛应用于现代UI开发,尤其是在WPF、Xamarin、Angular、React以及Vue等框架中。它源自MVC(Model-View-Controller)模式,但在UI层面上进行了...

    MVVM在Winform应用实例

    “MVVM在Winform应用实例”这个标题揭示了本次讨论的主题,即如何在Windows Forms(Winform)应用程序中应用Model-View-ViewModel(MVVM)设计模式。MVVM是一种软件架构模式,它在WPF和UWP等现代UI框架中广泛使用,...

    WPF-MVVM编程

    **WPF-MVVM编程**是一种在Windows Presentation Foundation(WPF)框架下开发用户界面时常用的设计模式。MVVM(Model-View-ViewModel)模式强调将业务逻辑、数据和用户界面进行分离,使得代码更加可测试、可维护,...

    MVVMLight页面跳转WPF

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)应用程序中利用MVVMLight库进行页面间的导航。MVVMLight是由GalaSoft开发的一个轻量级MVVM(Model-View-ViewModel)框架,它为WPF和UWP提供了...

    c# MVVM 小例子

    **C# MVVM 模式详解** MVVM(Model-View-ViewModel)模式是一种软件设计模式,常用于创建用户界面,特别是在WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform)应用程序中。这个模式在C#...

    WPF+Mvvmlight 简单的导航实例

    在本文中,我们将深入探讨如何使用WPF(Windows Presentation Foundation)框架结合MvvmLight库创建一个简单的导航实例。MvvmLight是由GalaSoft开发的轻量级MVVM(Model-View-ViewModel)库,它为WPF应用提供了一...

    MVVMLight框架下的wpf登陆程序demo

    MVVMLight,全称为MVVM Light Toolkit,是由GalaSoft公司开发的一个轻量级、易用的MVVM(Model-View-ViewModel)框架,适用于Windows Presentation Foundation (WPF)、Universal Windows Platform (UWP)、Xamarin...

    lua实现cocos2d-x的mvvm框架

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

    WPF MVVM 模式使用DataGrid

    在Windows Presentation Foundation (WPF) 中,MVVM(Model-View-ViewModel)是一种设计模式,它将业务逻辑、用户界面和数据模型分离,使得代码更易于维护和测试。本篇文章将详细探讨如何在MVVM模式下有效地使用...

    devexpress winform mvvm demo

    【标题】"DevExpress WinForm MVVM Demo"是一个展示如何在Windows Forms应用程序中使用Model-View-ViewModel(MVVM)设计模式的示例项目。DevExpress是一家知名的软件开发公司,提供了一系列强大的UI控件和开发工具...

    dotnet-communitytoolkit-mvvm

    dotnet-communitytoolkit-mvvm CommunityToolkit.Mvvm 是一个现代、快速且模块化的 MVVM 库,作为 .NET 社区工具包的一部分。它围绕以下原则构建:平台和运行时独立、易于选取和使用、点菜自由选择要使用的组件、...

    MVVM light小实例

    **MVVM Light 小实例详解** MVVM Light(Model-View-ViewModel Light)是由 Laurent Bugnion 创建的一个轻量级框架,它简化了在 Silverlight、WPF 和 Xamarin 平台上的 MVVM(Model-View-ViewModel)设计模式的实现...

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

    **WPF MVVMLight框架详解** MVVMLight是GalaSoft公司开发的一个轻量级、易用的MVVM(Model-View-ViewModel)框架,它为Windows Presentation Foundation(WPF)应用程序提供了强大的支持。该框架简化了MVVM模式的...

    WPF MVVM完整示例(登录窗口)

    **WPF MVVM完整示例(登录窗口)** 在Windows Presentation Foundation (WPF)中,Model-View-ViewModel (MVVM)是一种常见的设计模式,它将业务逻辑、用户界面和数据模型分离,使得代码更加可测试和易于维护。本示例...

    mvvm享学项目代码资料

    《深入理解MVVM架构在项目开发中的应用》 MVVM(Model-View-ViewModel)架构是一种广泛应用于现代软件开发,特别是在移动应用和Web应用中的设计模式。它将应用程序的业务逻辑、用户界面和数据模型分离开来,提高了...

    WPF 轻量级 MVVM 框架入门 2.1.2

    **WPF轻量级MVVM框架入门2.1.2** 在Windows Presentation Foundation(WPF)开发中,MVVM(Model-View-ViewModel)模式是一种常见的设计模式,它有助于实现应用程序的视图与业务逻辑之间的解耦。MVVM通过数据绑定、...

    C#MVVM架构 简单实例可以运行

    **C# MVVM架构简介** MVVM(Model-View-ViewModel)是一种软件设计模式,尤其在开发WPF、UWP和Xamarin等基于.NET Framework的桌面应用或移动应用时广泛应用。该模式源自经典的MVC(Model-View-Controller)模式,但...

Global site tag (gtag.js) - Google Analytics