先科普一下:什么是WPF,请看下图

微软对于WPF技术的构想是很宏大的,可惜普及率不高,不过如果你要做Windows客户端开发的话WPF技术还是值得一学的。

什么是MVVM模式#

简单来说它是一种高级的UI设计模式。据我所知目前还运用在一些js框架中,比如AngularJS。其他的UI设计模式还包括MVC、MVP,个人觉得最强大的还是MVVM。

MVVM主体框架如下图:

  • The Model is the entity that represents the business concept; it can be anything from a simple customer entity to a complex stock trade entity .
  • The View is the graphical control or set of controls responsible for rendering the Model data on screen .A View can be a WPF window, a Silverlight page, or just an XAML data template control .
  • The ViewModel is the magic behind everything .The ViewModel contains the UI logic, the commands, the events, and a reference to the Model .
  • In MVVM, the ViewModel is not in charge of updating the data displayed in the UI—thanks to the powerful data-binding engine provided by WPF and Silverlight, the ViewModel doesn’t need to do that .This is because the View is an observer of the ViewModel, so as soon as the ViewModel changes, the UI updates itself .For that to happen, the ViewModel must implement the INotifyPropertyChangedinterface and fire the PropertyChangedevent .

简单翻译一下(不全)

  • The Model 代表业务逻辑的实体类,可以是一个简单的顾客实体类,也可以是一个复杂的股票交易实体类。
  • The View 代表一个用户界面控件 ...
  • The ViewModel 包括各种逻辑、命令、事件以及实体类的引用。

什么是MVVMFoundation#

MVVMFoundation是一个最简单的MVVM框架,官方介绍如下:

MVVM Foundation is a library of classes that are very useful when building applications based on the Model-View-ViewModel philosophy. The library is small and concentrated on providing only the most indispensable tools needed by most MVVM application developers

MVVMFoundation包含四大模块:

  • ObservableObject:这里相当于ViewModelBase的概念,每一个ViewModel继承自该类,调用完成之后立即释放,防止内存泄露。

  • RelayCommand接口:封装command的声明,包括execution执行逻辑,可选的can-execute逻辑等。外部只需要实例化并Binding就可以简单使用。

  • Messenger:这里主要用在各种不同的ViewModel之间通信(比如相互关联的ViewModel、主从ViewModel等),当然也可以扩展成ViewModel与View之间进行通信。

  • PropertyObserver:主要是对INotifyPropertyChanged.PropertyChanged进行封装,可以通过其对某个对象的属性变更注册回调函数,当属性变更时便触发回调函数。

ObservableObject#

实现ViewModel中的属性改变通知到绑定的控件的方法,相当于是所有Viewmodel的基类。

  1. 使用时调用OnPropertyChange方法,则后台数据变化即可通知界面刷新

     public string UserName
    {
    get { return this.user.UserName; }
    set
    {
    this.user.UserName = value;
    OnPropertyChanged("UserName");
    }
    }
  2. 属性在View界面的绑定

     <TextBox Text="{Binding UserName}" />

RelayCommand#

用于在ViewModel中定义View中绑定的命令,代替了以前Winform的Click事件。

  1. 在ViewModel中定义Command

     public ICommand BrowseImageCommand
    {
    get { return new ICommand(BrowseImage); }
    } private void BrowseImage()
    {
    ...
    }
  2. 在View中的按钮关联此Command

     <Button Content="浏览..." Command="{Binding BrowseImageCommand}"/>

Messenger#

可用于ViewModel之间的信息传递,可以用于ViewModel和View之间的信息传递。

  1. 定义信息传输类

     public class ViewModelCommunication
    {
    static ViewModelCommunication()
    {
    Messaging = new Messenger();
    } public static Messenger Messaging { get; set; } public static string DataIDInChanged { get { return "DataIDInChanged"; } }
    }
  2. 在需要通知的类中注册要通知的信息

     ViewModelCommunication.Messaging.Register(ViewModelCommunication.DataIDInChanged,(Action<string>)(param => SetLastSelectedDataID(param)));
  3. 当对应的消息出现时,通知已经注册的类

     ViewModelCommunication.Messaging.NotifyColleagues(ViewModelCommunication.DataIDInChanged, DataID.ToString());

PropertyObserver#

主要用于对对象的属性监听,属性变更后可触发已注册的回调函数。

  1. 注册要监听对象的属性及回调函数

     PropertyObserver<UserInfoViewModel> userInfoAfterObserver;
    public MainWindowViewModel()
    {
    UserInfoBefore = new UserInfoViewModel();
    userInfoAfterObserver = new PropertyObserver<UserInfoViewModel>(UserInfoAfter)
    .RegisterHandler(UserInfo => UserInfo.Age, this.AgeChangedCallback);
    }
  2. 实现回调函数

     private void AgeChangedCallback(UserInfoViewModel userInfo)
    {
    MessageBox.Show("Property Age changed");
    }

以上就是MVVMFoundation框架的主要使用方法,感兴趣的人可以用用看~欢迎留言交流心得~

浅谈WPF中的MVVM框架--MVVMFoundation的更多相关文章

  1. 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)

    原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...

  2. 简单的介绍下WPF中的MVVM框架

    最近在研究学习Swift,苹果希望它迅速取代复杂的Objective-C开发,引发了一大堆热潮去学它,放眼望去各个培训机构都已打着Swift开发0基础快速上手的招牌了.不过我觉得,等同于无C++基础上 ...

  3. 浅谈前端中的mvvm与mvc

    用了vue这么久,却没有认真的关注mvvm与mvc,着实汗颜.趁着周末刚好看了一下网上的文章还有书籍,简单的谈一下我的理解. -以下图片均摘自网络. 一.MVC 特点:单项通讯 视图(View):用户 ...

  4. 浅谈WPF中的PreviewTextInput

    今天在使用TextBox的TextInput事件的时候,发现无论如何都不能触发该事件,然后百思不得其解,最后在MSDN上找到了答案:TextInput 事件可能已被标记为由复合控件的内部实现进行处理. ...

  5. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  6. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  7. 浅谈WPF页间导航

    浅谈WPF页间导航 使用导航的目的是从一个页面进入到另一个页面.无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Naviga ...

  8. 浅谈WPF依赖项属性

    浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...

  9. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

随机推荐

  1. 几个VB常见又内涵的错误

    第一位内涵的就是:没有对象 找到对象,却发现是别人的对象 不能加载也不能卸载...这到底是什么对象 哈哈哈~

  2. node02

    1.使用已有的知识实现一个简单的登录和注册的界面 请求有请求接口有请求页面的,我们需要加以区分 以下是客户端代码 <!DOCTYPE html> <html lang="e ...

  3. 我用linux系统的采坑记

    我的新Ubuntu18,也没安装什么,但是在使用过程中总是莫名其妙的卡死,真的很烦.有时候cpu使用率接近100%,有时候貌似是内存不够了,但是我明明是8GB,这些小问题搞得我很恼火.这样的机器真的不 ...

  4. openCV 简单实现身高测量(未考虑相机标定,windows)

    (一) OpenCV3.1.0+VS2015开发环境配置 下载OpenCV安装包(笔者下载3.1.0版本) 环境变量配置(opencv安装路径\build\x64\vc14\bin,注意的是x64文件 ...

  5. idea git将多余的代码提交到本地,如何退回。

    场景:代码commit到本地仓库,还没有push到远程仓库,这时要回退代码. 介绍下Reset Head中三种Reset Type类型: 1.Mixed(默认):它回退到某个版本,本地会保留源码,回退 ...

  6. 替换url中的域名

    /**     *      * @param domain 域名     * @param port   端口号     * @param url    url路径     * @return   ...

  7. Html元素添加事件禁用

    最近几天,测试在检测我页面功能时,疯狂点击带接口请求的按钮,然后就会发起无数次请求,然后app就卡住了.当看到这个问题的时候,心里疯狂鄙视测试(开个玩笑),一开始想的到解决方案是用函数防抖,使用函数防 ...

  8. 微信报错 config:fail.Error:invalid signature

    config:fail.Error:invalid signature 微信公众号报这个错,appid等各项都配置好,经过一番折腾,发现原来ip白明单设置了不是该服务器的ID,重新设置后就可以了

  9. db2数据库常见问题

    db2数据库不能轻易改变表结构,不然表会进入暂挂状态,造成表被锁住. 解锁表语句:call sysproc.admin_cmd('reorg table <table name>');

  10. [BlueZ] 2、使用bluetoothctl搜索、连接、配对、读写、使能notify蓝牙低功耗设备

    星期三, 05. 九月 2018 02:03上午 - beautifulzzzz 1.前言 上一篇讲了如何编译安装BlueZ-5,本篇主要在于玩BlueZ,用命令行去操作BLE设备: [BlueZ] ...