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 ...
随机推荐
- 搭建SSH框架心得
<Struts2+Spring4+hibernate3> 工程结构 导入相关jar包:自行网上百度即可,根据环境需要 写dao类 以及实现 package com.icommon.dao; ...
- js插件ztree使用
最新给公司后台写了一个配置页面,在网上搜到一个js插件ztree,记录一下使用心得. 首先说一下ztree官网,好多方法我都是从官网api上学习的,官网地址http://www.treejs.cn/v ...
- dubbo-admin 配置运行
1.下载dubbo源码:http://dubbo.io/ 2.idea 导入maven项目 3.配置tomcat:http://localhost:8080/ 4.下载zookeeper:http:/ ...
- Linux下挂载iso文件和配置yum本地源
Linux的版本: [root@pbn ~]# head -n 1 /etc/issueRed Hat Enterprise Linux Server release 6.1 (Santiago) 1 ...
- ASP中替换掉换行符<br>
function HtmlStrReplace(Str) if Str="" or isnull(Str) then HtmlStrReplace="" ...
- js获取元素属性值为空的原因和解决办法
问题描述:js获取某元素的属性值为空 代码: <!-- css定义在head中 --> <style> #box{ width: 100px; height: 100px; b ...
- (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- 什么是 SaaS (Software as a Service)
什么是SaaS (Software as a service ) 把软件作为一个服务.SaaS是一种cloud-based 和通过Internet提供软件的模式,用户不用再购买软件,而改用向提供商租用 ...
- Problem 1: Multiples of 3 and 5
小白一枚,python解法,共同学习,一起进步. Problem 1: Multiples of 3 and 5 If we list all the natural numbers below 10 ...
- LINQ Expresstion Tree 表达式树
Expression trees represent code in a tree-like data structure, where each node is an expression, for ...