Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WPF中的命令(Command)

WPF中的命令(Command)

作者头像
宿春磊Charles
发布于 2021-11-05 08:30:23
发布于 2021-11-05 08:30:23
1.3K0
举报
文章被收录于专栏:DotNet 致知DotNet 致知

这节来讲一下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程序员节,祝大家节日快乐!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[UWP]为番茄钟应用设计一个平平无奇的状态按钮
OnePomodoro应用里有个按钮用来控制计时器的启动/停止,本来这应该是一个包含“已启动”和“已停止”两种状态的按钮,但我以前在WPF和UWP上做过太多StateButton、ProgressButton之类的东西,已经厌倦了这种控件,所以我在OnePomodoro应用里只是简单地使用两个按钮来实现这个功能:
dino.c
2019/11/13
7360
WPF自学入门(十一)WPF MVVM模式Command命令
在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新。但是这并不是我们使用MVVM的正确方式。正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了Xaml文件和CS文件的耦合度,分离界面和业务逻辑,所以我们要尽可能的在View后台不写代码。但是这个例子中,我们将更新ViewModel的代码写在了View里,下一个例子中,我们要通过命令(Command)的来将Button的事件分离出来。
黄昏前黎明后
2019/08/26
3.6K0
WPF自学入门(十一)WPF MVVM模式Command命令
【我们一起写框架】MVVM的WPF框架之绑定(二)
上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体。
Kiba518
2018/09/28
1.9K0
【我们一起写框架】MVVM的WPF框架之绑定(二)
深入浅出话命令
WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”。事件的作用是发布、传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于如何响应事件送来的消息事件并不做任何限制,每个接收者可已用自己的行为来响应事件。也就是说,事件不具有约束力。命令和事件的区别就在于命令具有约束力。
莫问今朝
2018/08/31
1.7K0
深入浅出话命令
WPF【框架学习】MVVM初探(经典)
之前接触并使用过MVC,Model - View - Controller的模式,页面和代码分离的写法,MVVM:Model - View - ViewModel,和WPF很好的进行结合,View负责界面,主要是写.xaml的文件,Model是一些实体类,ViewModel是关键,意思是View的Model,View需要什么,ViewModel提供什么,如果将View理解为界面,Model和ViewModel以及Service等理解为后台的话,那么界面和后台是没有任何关系的,界面开发人员只要告诉后台人员需要哪些对象\属性,就可以进行开发了,二者之间的结合通过Binding操作进行绑定,解耦效果优于MVC,架构图如下:
zls365
2021/02/26
2.6K0
WPF 绑定命令在 MVVM 的 CanExecute 和 Execute 在按钮点击都没触发可能的原因
在 WPF 推荐使用 MVVM 绑定命令,但是绑定命令会存在很多坑,其中一个就是焦点的问题。如果在用户点击按钮的时候出现了焦点修改,那么此时的命令是不会被触发
林德熙
2022/08/04
2.1K0
WPF进阶之MVVM教程(一)
自写了WPF入门系列(点击学习)文章,收到很多大学生的私信,经常会问一些MVVM的问题,由于自己对MVVM也并不了解,遇到问题也是经常请朋友帮忙看看,趁着业余时间,经过一段时间得学习、开始写MVVM系列的文章,主要写一下自己对MVVM的理解,希望这不仅是对自己成长的记录,也能对同学们有所帮助。
剑指工控
2022/11/14
1.6K0
WPF进阶之MVVM教程(一)
WPF命令(Command)介绍、命令和数据绑定集成应用
要开始使用命令,必须做三件事:                                               一:定义一个命令                                               二:定义命令的实现                                               三:为命令创建一个触发器     WPF中命令系统的基础是一个相对简单的ICommand的接口,代码如下: public interface IComma
hbbliyong
2018/03/05
6.2K0
WPF命令(Command)介绍、命令和数据绑定集成应用
WPF MVVM实例一
在Model文件夹下新建业务类StudentModel(类文件StudentModel.cs),类的详细代码如下所示。
zls365
2021/02/01
7640
WPF MVVM实例一
WPF TreeGrid MVVM 模式下自定义表格带展开缩放效果,并且可以获取点击行的数据
MVVM其实就是:Model 、View、ViewModel三个的简称,就像MVC一样。 Model就是模型。View就是视图。ViewModel就是和view进行绑定的。
Shunnet
2022/05/31
6.1K0
WPF TreeGrid MVVM 模式下自定义表格带展开缩放效果,并且可以获取点击行的数据
.NET Core 3 WPF MVVM框架 Prism系列之命令
我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之数据绑定中知道prism实现数据绑定的方式,我们按照标准的写法来实现,我们分别创建Views文件夹和ViewModels文件夹,将MainWindow放在Views文件夹下,再在ViewModels文件夹下面创建MainWindowViewModel类,如下:
ryzenWzd
2020/04/29
1.9K0
Silverlight学习(三)
最近对WCFRIA+MVVM+Prism有了初步的认识,能够简单的实现一些数据库的交互。这节主要讲的是Silverlight通过domainservice和ado.net实体数据模型与数据库的交互。本文的重点是与数据库的交互,包括简单的CURD,以下是实现的一些主要过程: 1.在Sql数据库中新建userinfo表,包括的字段为id,name,age.数据库创建的存储过程为: 1 USE [Test] 2 GO 3 4 /****** Object: Table [dbo].[userinfo]
水击三千
2018/02/27
7980
Silverlight学习(三)
[Windows] Prism 8.0 入门(上):Prism.Core
Prism 是一个用于构建松耦合、可维护和可测试的 XAML 应用的框架,它支持所有还活着的基于 XAML 的平台,包括 WPF、Xamarin Forms、WinUI 和 Uwp Uno。Prism 提供了一组设计模式的实现,这些模式有助于编写结构良好且可维护的 XAML 应用程序,包括 MVVM、依赖项注入、命令、事件聚合器等。
dino.c
2020/12/08
2.2K0
WPF MVVM 模式下自写自用的窗口样式
废话我也就不多说,直接上菜(由于公司电脑做了加密,无法把代码压缩发布,只能以这种方式来分享)
Shunnet
2022/09/01
1.7K0
WPF MVVM 模式下自写自用的窗口样式
[UWP 自定义控件]了解模板化控件(7):支持Command
以我的经验来说,要让TemplatedControl支持Command的需求不会很多,大部分情况用附加属性解决这个需求会更便利些,譬如UWPCommunityToolkit的HyperlinkExtensions。
dino.c
2019/01/18
5320
C# WPF MVVM开发框架Caliburn.Micro入门介绍①
Caliburn.Micro是一套基于XAML的MVVM模式的开发框架,它小巧而强大。在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel,就是它的View Model 的名字,如:MainPage和 MainPageViewModel。Caliburn.Micro自动把ViewModel绑定到View的DataContext。如果ViewModel 的属性名和控件的名称相同,那么就会自动绑定上。
用户9127601
2022/01/13
1.9K0
[WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点
在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 View 中的某个元素,让它获得焦点,例如这样:
dino.c
2020/12/28
1.6K0
[WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点
C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
GuZhenYin
2018/01/04
1.7K0
C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
WPF开源项目:WPF-ControlBase
仓库README很素,但看作者README贴的几篇博文介绍,你会喜欢上它的,废话不多说,上介绍目录:
沙漠尽头的狼
2021/12/01
3.6K0
WPF开源项目:WPF-ControlBase
.NET5 WPF进阶教程
本系列将继《.net wpf快速入门教程》带领大家了解wpf,帮助各位在初级向中级过渡的中掌握基本该具备的能力。本系列视频长度大约在15分钟到30分钟左右,视频内容不仅仅会讲解技能还会分享面试中常见的问题。
JusterZhu
2022/12/07
6170
推荐阅读
相关推荐
[UWP]为番茄钟应用设计一个平平无奇的状态按钮
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档