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

大家一起学习。。。

说说我的感受吧,一个小实例讲述了 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. LeetCode Number of Islands 岛的数量(DFS,BFS)

    题意:0代表水,1代表陆地,那么被水围起来的就是岛了,给一个01矩阵,问有多少个岛? 思路:DFS还是比较短,实现了一下.如果一个点已经被遍历过了,那就将其置为0就行了,不要去搜0的. class S ...

  2. apache开源项目 -- tomee

    Apache TomEE,发音是“Tommy”,是一个经Apache.JavaEE6.Web框架认证的适配器,其在Tomcat服务器中是最强大的.Apache TomEE是由香草项目(简化常见编程任务 ...

  3. 如何在Android开发中让你的代码更有效率

    最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善And ...

  4. css中position:relative的真正理解

    其实话说一直以来也没真正去理解好position:relative的用法的真实意义. 我想很多人实实在在用的多都是position:relative和position:absolute结合起来一起用的 ...

  5. .NET Remoting

    .NET Remoting   .NET Remoting是微软早期的分布式通信技术,虽然微软后来通过WCF通用基础通信框架整合掉了,但是通过回顾学习Remoting,反过来学习理解WCF也是很有帮助 ...

  6. java web 学习二(Tomcat服务器学习和使用1)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  7. DIV+CSS常见问题:DIV如何设置一个像素高度?

    CSS如何控制DIV实现1像素高度呢?问题看起来很简单,但万恶的IE6会让你很麻烦,不过解决办法很多,本文将介绍最简单的一种:DIV{height:1px;line-height:1px;font-s ...

  8. jQuery Mobile入门教程

    简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的.可跨设备的Web应用程序.我们将后续的介绍中向大家介绍大量的代码及实例. jQuery一直以来都是非常流行的富客户端及Web应用程 ...

  9. 最长公共子序列LCS

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. LCS具有最优子结构,且满足重叠子问题的 ...

  10. Hadoop上路-02_Hadoop FS Shell

    一.上传文件/目录 1)put 从本地文件系统中复制N个源路径到目标文件系统. 2)copyFromLocal 源路径须是一个本地文件. 二.下载文件/目录 1)get 复制文件到本地文件系统. 2) ...