WPF-MVVM-ICommand接口实现
一 接口分析
MVVM框架的目的就是让视图和业务逻辑分离,各干各的。那么怎样实现分离呢,精髓就是绑定ICommand。先看一下ICommand接口的定义:
//
// 摘要:
// 定义一个命令。
[TypeConverter("System.Windows.Input.CommandConverter, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
[TypeForwardedFrom("PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
[ValueSerializer("System.Windows.Input.CommandValueSerializer, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
public interface ICommand
{
//
// 摘要:
// 当出现影响是否应执行该命令的更改时发生。
event EventHandler CanExecuteChanged; //
// 摘要:
// 定义确定此命令是否可在其当前状态下执行的方法。
//
// 参数:
// parameter:
// 此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。
//
// 返回结果:
// 如果可执行此命令,则为 true;否则为 false。
bool CanExecute(object parameter);
//
// 摘要:
// 定义在调用此命令时要调用的方法。
//
// 参数:
// parameter:
// 此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。
void Execute(object parameter);
}
下面对接口中给的几个组成部分进行分析:
CanExecuteChanged:按照官方的说法是在调用CanExecute方法之前被触发
参考这个https://msdn.microsoft.com/zh-cn/library/system.windows.input.icommand.canexecutechanged.aspx
CanExecute:这个方法返回值为bool值,绑定到此命令的按钮是否可用。
这个方法在用户点击按钮后,自动触发。
Execute:这个方法就是业务逻辑的载体,用户点击按钮后,自动触发。
二 继承关系
首先需要对接口ICommand进行实现,比如叫做DelegateCommand。那么我们如何进行实现呢,把业务逻辑卸载接口的实现类里面吗?如果这样,那么每个按钮都需要定义一个ICommand的实现类了。我们引入委托的概念,把具体的的业务实现写在viewmodel类中,然后把业务实现类封装成委托交给ICommand实例来调用, 从而实现了DelegateCommand的复用。
比如下面的例子,Execute执行的是一个委托,并且把委托定义为public类型,以便于外面的viewmodel给委托进行赋值,如果不给委托赋值就代表不执行喽。
class DelegateCommand : ICommand
{
public bool CanExecute(object parameter)
{
if (this.CanExecuteFunc == null)
{
return true;
} return this.CanExecuteFunc(parameter);
} public event EventHandler CanExecuteChanged; 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; }
}
三 ViewModel
如何编写viewmodel呢?
新建一个viewmodel类,比如:MainWindowViewModel.cs
定义一个command,如:public DelegateCommand AddCommand { get; set; }
然后再进行给command中的委托赋值,这样程序就会通过调用Execute,调用委托,达到调用viewmodel中的业务逻辑了。
比如业务逻辑方法这样写:
private void Add(object parameter)
{
this.Result = this.Input1 + this.Input2;
}
为command中的委托赋值:
this.AddCommand.ExecuteAction = new Action<object>(this.Add);
是不是有点绕呢,没错太绕了。网上有很多中写法,乱花渐欲迷人眼,但基本上都是这个意思。
四 界面绑定
先将MainWindowViewModel的实例,作为当前界面的上下文:
this.DataContext = new MainWindowViewModel();
xaml很简单,就这样一行代码
<Button x:Name="addButton" Grid.Row="3" Content="Add" Width="120" Height="80" Command="{Binding AddCommand}"/>
另外如果想再传会一个参数,可以这样写(详见demo):
Command="{Binding AddCommand}" CommandParameter="para1"
至于如何将鼠标的位置,按钮自身的信息传递到vm中,就比较复杂了,请参考其它文献。也可以在view的后台中进行处理,毕竟是界面相关的东西。
五 原理分析
那么CanExecute和Execute这两个方法是如何被调用的呢?难道是框架自己调用的吗?有一定关系,主要是和wpf绑定机制有关。当我们把一个Icommand实例绑定到界面的按钮上,点击按钮,则会触发ICommand中的方法Execute。至于为什么会触发,只能说微软自己封装的,不用我们自己来触发。
下面有两个demo仅供参考。
http://download.csdn.net/download/conganguo/10120119
---------------------
作者:12345678910dddwwwb
来源:CSDN
原文:https://blog.csdn.net/conganguo/article/details/78542968
版权声明:本文为博主原创文章,转载请附上博文链接!
WPF-MVVM-ICommand接口实现的更多相关文章
- [译]WPF MVVM 架构 Step By Step(5)(添加actions和INotifyPropertyChanged接口)
应用不只是包含textboxs和labels,还包含actions,如按钮和鼠标事件等.接下来我们加上一些像按钮这样的UI元素来看MVVM类怎么演变的.与之前的UI相比,这次我们加上一个"C ...
- WPF进阶之接口(4):ICommand实现详解
上一章WPF进阶之接口():INotifyPropertyChanged,ICommand中我们遗留了几个问题,我将在本节中做出解释.在详细解释ICommand实现之前,我们现在关注一下什么是:弱引用 ...
- MVVM设计模式基础知识--ICommand接口
命令是 Windows Presentation Foundation (WPF) 中的输入机制,它提供的输入处理比设备输入具有更高的语义级别. 命令有若干用途: 第一个用途是将语义以及调用命令的对象 ...
- 转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式
原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用 ...
- WPF MVVM之INotifyPropertyChanged接口的几种实现方式(转)
原地址:https://www.cnblogs.com/xiwang/archive/2012/11/25/2787358.html 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比 ...
- WPF MVVM 学习总结(一)
---恢复内容开始--- 1. MVVM简介 在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑.所以备受广大开发者的喜爱. ...
- WPF MVVM模式
1. MVVM MVVM的设计模式最早于2005年由微软的WPF和Silverlight架构师John Gossman在他的博客中提到. WPF中采用MVVM的架构可以获得以下好处: 1. 将UI和业 ...
- WPF/MVVM 快速开始指南(译)(转)
WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...
- Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】
开发工具: VS2010 Blend Prism框架 基本概念: 数据绑定,依赖属性,依赖对象 WPF 委托式命令 Icommand接口 Lambda表达式 MVVM(Model-View-ViewM ...
- WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)
到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击but ...
随机推荐
- 在Python工作环境中安装包命令后加上国内源速度*15
example: pip install -r requests.txt -r https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pyp ...
- browser_action' is only allowed for extensions but this is a legacy packaged app
manifest.json中不可包含调试代码: "app": { "launch": { "local_path": ...
- 页面制作学习笔记:D1.概述
一.Web发展历史 Web1.0 :早期HTML页面:例:网易的门户网站163.com. Web2.0:AJAX技术规模应用:例:网易邮箱126.com. Web3.0:HTML5技术规模应用:例:网 ...
- 2018-2019-2 20175224 实验二《Java面向对象程序设计》实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:艾星言 学号:20175224 指导教师:娄嘉鹏 实验日期:2019年4月17日 实验时间:13:45 - 15:25 实验序号:24 ...
- day14 内置函数二
lamda 语法: 函数名 = lambda 参数: 返回值注意: 1. 函数的参数可以有多个. 多个参数之间⽤逗号隔开 2. 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据 3. 返回 ...
- 搭建项目(Vue学习笔记一)
一.在搭建Vue项目之前首先要搞明白以下几个问题 1.Vue.js是什么 vue.js是一个脚本库. 2.webpack 模块打包机,分析项目结构,找到JavaScript模块以及其他的一些浏览器不能 ...
- 关于redis的安装
下载redis 我这边下载redis4.0.1版本, 然后解压 然后执行yum -y install gcc gcc-c++ libstdc++-devel 然后cd //qbtapp/redis-4 ...
- 2018.12.02 Socket编程之初识Socket
Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...
- 运维yum搭建zabbix
前言: zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证 ...
- 前端生成水印之SVG方式
SVG:可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式. SVG由W3C制定,是一个开放标准. (f ...