这个模式,一下子把我的思路给打开。。让我眼前一亮。。居然可以这样将界面分离得如此彻底。。。。。。。。。。。

大家一起学习。。。

说说我的感受吧,一个小实例讲述了 MVVM实现原理:

一个简单的例,将两个数相加。。

MVVM,可能有人在说 M 不就是Model ,那个这Model是否一定要存在呢?

但很多时候,这个Model可以不需要,,只用ViewModel就可以的。。还是结合代码说吧,

这个就是ViewModel 对外公布的属性,Input1,Input2,Result ,看到吗,继承NotificationObject类,,,这个是数据属性。。如上图说明。。数据属性是双向的,那他又是如何来的呢  这个就是通知,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MVM.ViewModels
{
/// <summary>
/// 具有通知能力的就是viewmodel的基类 wpf中的DataBinding
/// </summary>
public class NotificationObject:INotifyPropertyChanged
{ #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
//触发一个事件 PropertyChanged
this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}

一个命令属性。。DelegateCommand  大家就在想这个DelegateCommand 是怎么来的呢,接着看下面代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using MVM.Commands;
namespace MVM.ViewModels
{
public class MainWindowViewModel:NotificationObject
{
private double input1; public double Input1
{
get { return input1; }
set
{
input1 = value;
this.RaisePropertyChanged("Input1");
}
}
private double input2; public double Input2
{
get { return input2; }
set
{
input2 = value;
this.RaisePropertyChanged("Input2");
}
} private double result;
public double Result {
get { return result; }
set {
result = value;
this.RaisePropertyChanged("Result");
}
}
//创建命令属性。。。
public DelegateCommand AddCommand { get; set; }
//当AddCommand的Execute的时候,我们想要他做什么呢。。我们想要他做两个数据相加
public void Add(object parameter) {
Result = Input1 + Input2;
}
public DelegateCommand OpenCommand { get; set; }
private void Open(object parameter)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.ShowDialog();
} public MainWindowViewModel() {
this.AddCommand = new DelegateCommand();
this.AddCommand.ExecuteAction = new Action<object>(this.Add); this.OpenCommand = new DelegateCommand();
this.OpenCommand.ExecuteAction = new Action<object>(this.Open);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input; namespace MVM.Commands
{
public class DelegateCommand:ICommand
{
#region ICommand 成员 public bool CanExecute(object parameter)
{
if (this.CanExecuteFunc == null) {
return true;
}
return this.CanExecuteFunc(parameter);
} public event EventHandler CanExecuteChanged; /// <summary>
/// 关键(命令执行时,你想做什么)
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
if (this.ExecuteAction == null) {
return;
}
this.ExecuteAction(parameter);
}
public Action<object> ExecuteAction { get; set; } public Func<object,bool> CanExecuteFunc { get; set; }
#endregion
}
}

界面,就更简单了。。

项目经验之:MVVM初学者图形化笔记整理。。。的更多相关文章

  1. IT项目量化管理:细化、量化与图形化 与 中国IT项目实施困惑

    IT项目开发和实施的组织先后在组织中引入项目管理模型的管理制度.流程和方法,但收入甚微.大量的IT项目依然面临着无休止的需求蔓延与频繁加班.项目工期失控.质量低下等典型的项目失控现象.对项目引入量化意 ...

  2. 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路

    layout: post title: 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 key: 20180517 tags: OAA flow chart se ...

  3. Kittenblock画笔基础,移动留下痕迹的蝴蝶,图形化编程经验分享

    Kittenblock画笔基础,移动留下痕迹的蝴蝶,图形化编程经验分享 跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关 ...

  4. 手写笔记变PDF-几行代码变命令行程序为图形化界面

    前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...

  5. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

  6. 通过 SSH 隧道方式图形化连接 AIX 服务器

    跳转到主要内容 登录 (或注册) 中文 [userid] IBM ID: 密码: 保持登录. 单击提交则表示您同意developerWorks 的条款和条件. 查看条款和条件. 需要一个 IBM ID ...

  7. Java项目经验——程序员成长的关键(转载)

    Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以 ...

  8. Java项目经验

    Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...

  9. java面试项目经验:框架及应用

    Java项目经验 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3 ...

随机推荐

  1. codeforces 340C Tourist Problem(简单数学题)

    题意:固定起点是0,给出一个序列表示n个点,所有点都在一条直线上,其中每个元素代表了从起点到这个点所走的距离.已知路过某个点不算到达这个点,则从起点出发,到达所有点的方案有许多种.求所有方案走的总路程 ...

  2. Android 仿百度网页音乐播放器圆形图片转圈播放效果

    百度网页音乐播放器的效果  如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ...

  3. Android设计模式源码解析之桥接模式

    模式介绍 模式的定义 将抽象部分与实现部分分离,使它们都可以独立的变化. 模式的使用场景 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系. 设计要 ...

  4. Solr DIH以Mysql为数据源批量创建索引

    演示使用solr管理后台,以mysql为数据源,批量建索引的方法 测试于:Solr 4.5.1, mmseg4j 1.9.1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS ...

  5. FileReader乱码

    出现原因:FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来 ...

  6. HTML5实现扫描识别二维码/生成二维码

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

  7. Android Scrollview 内部组件android:layout_height="fill_parent"无效的解决办法

    Found the solution myself in the end. The problem was not with the LinearLayout,  but with the Scrol ...

  8. GIT 分支的理解

    乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本 ...

  9. xcode 怎么样在发布release版本的时候 不输出log

    我们平时在开发应用的时候,经常会用到 NSLog 来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 发布正式版的时候一定要屏蔽掉所有后台输出,因为这些输出还是比较消耗系统 ...

  10. 无序数组a,求a[i]-a[j]的最大值,且i<j

    一道面试题:对于无序数组a,求a[i]-a[j]的最大值,其中i<j package test; import java.util.Arrays; public class FindMax { ...