这节来讲一下WPF中的命令(Command)的使用。

【认识Command】

我们之前说过,WPF本身就为我们提供了一个基础的MVVM框架,本节要讲的命令就是其中一环,通过在ViewModel中声明命令,从View中使用Binding绑定命令,就能实现从View到ViewModel之间操作的流通。

ICommand 接口:

所有的命令都是需要继承ICommand接口,该接口有如下三个成员:

我们先说第二个成员,它是个返回值为bool的方法,通过这个方法,可以设置命令能不能继续执行,即返回值为TRUE,命令继续执行,返回值为FALSE命令不会执行;

第一个成员是个事件处理器,从名字可以看出来该事件处理器关注于第二个成员,也就是当命令能否执行的状态出现改变时可以使用此事件通知到关注此命令执行状态的成员;

第三个成员也是个方法,命令的执行逻辑放在这个方法里边,当CanExecute返回值为TRUE时,该方法才会被执行。

【自定义Command】

下面我们就来自定义一个命令,这样能比较方便的演示命令的使用:

本节以MVVM模式演示,项目结构如下:

MyCommand为自定义的命令类,代码如下:

MyCommand类在实例化时需要外部传入执行的方法以及能否继续执行的判断方法。

MainViewModel中的代码如下:

在ViewModel中声明命令要注意,命令必须是属性,不能是字段。

View代码如下:

在Button有个Command属性,我们可以直接使用Binding和ViewModel中的命令对象做绑定。

此处要注意MainView的构造方法中这一行代码:

DataContext属性要设置为ViewModel实例,这样View才能跟ViewModel关联上,从而使用Binding才能绑定上MyCommand命令。

另外需要知道的是,Button中的Command是通过点击触发的,也就是说当你点击的Button命令就会执行,其它的控件,如ListBox中的Item,需要双击才能执行命令,因为单击是选中Item。

当程序运行时,点击按钮,输出窗口会打印“命令被执行了”字样:

然后我们清除掉输出窗口的内容,当再一次点击按钮时,因为isCanExec被设置为FALSE,所以命令终止执行,输出窗口无内容:

【命令参数CommandParameter】

如果命令仅仅是这样使用,那就太单调了,大家肯定注意到了Execute和CanExecute方法还有个类型为object的参数,这个参数就是命令参数,它可以接收我们自定义的数据,在执行命令时传入进来,我们则可以根据这个参数,对执行逻辑做多样化的判断,下面我将代码稍作改变:

在界面上放置两个按钮,并修改ViewModel代码为如下所示:

在Button中使用CommandParameter属性设置命令的参数,默认会将数据当做string处理,当然它也可以使用Binding跟其它属性做绑定,关于View与ViewModel之间的数据绑定,我们后期讲解。

在MyCommand的执行逻辑中判断参数的值,从而输出不同的结果,一次点击按钮结果如下:

本节到此结束,今天是1024程序员节,祝大家节日快乐!

WPF中的命令(Command)相关推荐

  1. Windows Presentation Foundation (WPF)中的命令(Commands)简述

    Windows Presentation Foundation (WPF)中的命令(Commands)简述 原文:Windows Presentation Foundation (WPF)中的命令(C ...

  2. WPF中的命令与命令绑定(二)

    WPF中的命令与命令绑定(二)                                              周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...

  3. 2021-12-11 WPF面试题 WPF中的命令设计模式是什么

    WPF中的命令设计模式是什么 命令设计模式是面向对象设计模式中最强大的设计模式之一. 此模式允许将操作请求与实际执行操作的对象分离,换句话说,命令模式将操作表示为对象. Command 对象不包含要执 ...

  4. WPF中改进自定义Command一些想法

    Command来源于Command命令模式,Command模式它封装的是命令,把命令发出者的责任和命令执行者的责任分开,直白的说为了调用与具体实现解耦.关于理论俺向来是不擅长的,而且各位达人的文章也已 ...

  5. WPF 自定义快捷键命令(COMMAND)(转)

    命令简介 WPF 中的命令是通过实现 ICommand 接口创建的.ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged).Exec ...

  6. WPF中对鼠标事件转换为命令处理模式的鼠标位置参数传递及EventArgs传递

    在WPF中使用命令模型,对于实现ICommandSource的元素来讲,比较方便,对于未实现ICommandSouce的元素来讲可以利用Blend中提供的行为来解决.通常情况下,命令对象可以传递命令参 ...

  7. 【转】在WPF中自定义控件

    周银辉的开发博客(WPF) 在WPF中自定义控件(1) 一, 不一定需要自定义控件 在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费 ...

  8. [转]在WPF中自定义控件 UserControl

    在这里我们将将打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来. 我们制作了一个带语音报时功能的钟表控件, 效果如下: 在VS中 ...

  9. 了解 WPF 中的路由事件和命令

    目录 路由事件概述 WPF 元素树 事件路由 路由事件和组合 附加事件 路由命令概述 操作中的路由命令 命令路由 定义命令 命令插入 路由命令的局限 避免命令出错 超越路由命令 路由处理程序示例 要想 ...

最新文章

  1. LDA基本介绍以及LDA源码分析(BLEI)
  2. linux php 断点调试,PHP断点调试工具Xdebug的安装
  3. 【linux】内核源代码下载与阅读
  4. java.lang.String 的 + 号操作,这个谜终于要解开了!
  5. 常见排序算法(C实现)
  6. docker安装jenkins并用docker部署net
  7. LeetCode887. 鸡蛋掉落
  8. 浅析.Net 在 winform及wpf中涉及界面交互的多线程类的封装
  9. JAVA延迟执行(thread方式和timer方式)
  10. R语言构建层次分析模型不看一下吗~
  11. Animate:基础学习
  12. python飞机大战源码素材包_python实现飞机大战微信小游戏
  13. Tomcat修改端口号图文详解
  14. Win10快捷键模式退出的方法
  15. 异数OS-织梦师-PBFT(六) 走出区块链,加速破解PBFT
  16. 视频分配器的特点以及应用
  17. mp4格式-播放和断点续播
  18. 系统迁移涉及到的方案
  19. Directional库的学习记录
  20. 【blender】动画导出方法

热门文章

  1. SAP中查询用户操作日志的事务码
  2. Oracle bigfile 大文件表空间会影响rman等备份效率
  3. 六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享
  4. Android应用程序消息处理机制(Looper、Handler)分析(5)
  5. IBM沃森为存储系统开发人员带来的启发
  6. android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
  7. 4-8 string
  8. turtle库基础练习
  9. 关中断是否禁止任务调度?关中断能作为互斥吗?
  10. mongo学习笔记(二):聚合,游标