---恢复内容开始---

1. MVVM简介

在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑。所以备受广大开发者的喜爱。View 说白了就是前台界面,可以用HTML5,Asp.net等实现,ViewModel 是连接层(类似于MVC中的Controller),他将Model 层和View层结合起来,并封装好命令,供View层绑定,Model层提供类的对象,供ViewModel可以轻松的访问数据库。

2. Demo简介

   在VS中创建一个WPF的工程,在里面加入Commands,Models,ViewModels,Views文件名,Commands里面封装了所有的操作命令的事件和委托,继承于ICommand,分别实现了ICommand接口中的CanExecute() 方法和 Execute ()方法,第一个方法返回bool 类型,所有后面增加,删除,IsExist 这种动作的操作都可绑定此方法,第二个方法返回空,就是执行所有的操作。还有一个委托CanExecuteChanged,当出现影响是否应执行该命令的更改时发生。

代码如下:  

namespace MVVMTest.Commands
{
     class DelegateCommand : ICommand
      {
             public Func<object, bool> CanExecuteFunc { get; set; }

public Action<object> ExcuteAction { get; set; }

public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter)
           {
              if (CanExecuteFunc == null)
              {
                 return true;
              }
              return CanExecuteFunc(parameter);
           }

public void Execute(object parameter)
         {
            if (ExcuteAction == null)
             return;
              ExcuteAction(parameter);
          }
     }
}

在ViewModel中增加一个类,这个类用来连接View和Model层,这个层把View层里面的时间绑定到ViewModel中的方法中,并且通过Model去处理操作过程。在ViewModel中这一层相当于MVC中的Controller层,和三层架构中的业务逻辑层处理的功能类似。

代码如下:

namespace MVVMTest.ViewModels
{
class UrlViewModel : NotificationObject
{
public DelegateCommand UrlCommand { get; set; } private Window window; private void Url(object parameters)
{
window.Show();
} public UrlViewModel(Window window)
{
this.window = window;
UrlCommand = new DelegateCommand();
UrlCommand.ExcuteAction = new Action<object>(Url);
}
}
}

上图代码 实现的功能是绑定所有跳转按钮的事件,当任何一个页面需要跳转的时候,都可以用这个ViewModel 类中的方法实现,这样就实现了同一类方法的重复调用,即MVVM中的可重用性,任何一个View 都可以使用这个ViewModel中的命令,如果View层动了,ViewModel层并不需要改动,体现了MVVM中的低耦合性。

View层中是所有的用户界面显示层,View 层可以用Asp.net, HTML5,JavaScript实现。

代码如下:

<Button Name="button1"
Width="178"
Height="35"
Margin="45,179,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Command="{Binding UrlCommand}"
Content="Add" />

  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MVVMTest.ViewModels; namespace MVVMTest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
 this.DataContext = new UrlViewModel(new MainWindow());
} }
}

这样 运行起来之后 当点击 Login 登录页面里面的Button 的时候,就可以跳转到 MainPage里面了。

在Model 层中,主要用来存放一些 实体对象,如User,Product,Goods这些对象,这些对象主要用来帮助ViewModel层中的命令去访问数据库层,或者做一些简单的处理。

    public class User
{
public string ID { get; set; }
public string Name { get; set; }
}

  

3. 总结

   MVVM 中更好了实现了面向对象中的继承和封装,所有的命令都继承自ICommand接口,他将所有的命令用ViewModel层去实现,将View层和Model层低耦合的绑定起来,使开发程序更快,更便捷,有效。

WPF MVVM 学习总结(一)的更多相关文章

  1. WPF+MVVM学习总结 DataGrid简单案例

    一.WPF概要 WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的 ...

  2. WPF MVVM 从Prism中学习设计模式之Event Aggregator 模式

    Prism简介 Prism是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的.更灵活.更易于维护并且更易于测试的WPF应用或是Silverlig ...

  3. WPF/MVVM 快速开始指南(译)(转)

    WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...

  4. 使用Prism提供的类实现WPF MVVM点餐Demo

    使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...

  5. WPF MVVM使用prism4.1搭建

    WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...

  6. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

  7. WPF项目学习.一

    WPF项目搭建 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 使用MVVM的优点是 数据和视图分离,双向绑定,低耦合,可重用行,相对独立 ...

  8. WPF项目学习.二

    WPF用MVVM的解决记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案.  焦点的控制,键盘事件触发,输入框的数字限制,异步处理,隐藏状 ...

  9. WPF项目学习.三

    工具代码记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 分页控件的制作,邮件发送,日志代码,excel导入导出等代码的实现过程: 二 ...

随机推荐

  1. JAVA实现国际化

    1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...

  2. angular的路由

    AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 下面 ...

  3. Uva 11354 LCA 倍增祖先

    题目链接:https://vjudge.net/contest/144221#problem/B 题意:找一条从 s 到 t  的路,使得瓶颈路最小. 点的数目是10^4,如果向之前的方案求 maxc ...

  4. Spring获取bean的工具类

    package com.tech.jin.util; import org.springframework.context.ApplicationContext; import org.springf ...

  5. Command: sl (Steam Locomotive)

    You might be aware of command 'ls' the list command and use it frequently to view the contents of a ...

  6. IBM X3850 Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘

    以前安装的是window2003 32位, 改装为2012 64位的时候.出现 Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows 只能安装到 GPT ...

  7. web前端之html5开发中常用的开发工具

    正所谓“工欲善其事,必先利其器”,对Web开发人员来说,好工具的使用总会给人带来事半功倍的效果.正准备学习HTML5或者已经进行了一段时间的HTML5开发的童鞋,都有必要了解下,HTML5都有哪些开发 ...

  8. 通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)

    最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...

  9. iOS静态库及Framework 创建

    本文转自cocoachina,尊重作者的汗水. 讲述的非常透彻,有需要的朋友可以阅读实践.转载请注明出处 //=================以下留着备份==================// 在 ...

  10. log4j PatternLayout 输出解析

    以下是PatternLayout.class源码的文档介绍: A flexible layout configurable with pattern string. This code is know ...