WPF MVVM入门系列教程(命令)

news/2025/3/30 15:11:47/文章来源:https://www.cnblogs.com/zhaotianff/p/18791423

WPF中的命令模型

在WPF中,我们可以使用事件来响应鼠标和键盘动作。但使用事件会具备一定的局限性,例如:我想通过键盘快捷键触发事件、或者在某个时刻禁用事件。如果使用代码去编写这些控制逻辑,会变得非常枯燥。因此WPF提供了命令模型。

命令具有多个用途。 第一个用途是分隔语义和从执行命令的逻辑调用命令的对象。 这可使多个不同的源调用同一命令逻辑,并且可针对不同目标自定义命令逻辑。 例如,许多应用程序中均有的编辑操作“复制”、“剪切”和“粘贴”若通过使用命令来实现,那么可通过使用不同的用户操作来调用它们。 应用程序可允许用户通过单击按钮、选择菜单中的项或使用组合键(例如 Ctrl+X)来剪切所选对象或文本。 通过使用命令,可将每种类型的用户操作绑定到相同逻辑。

命令的另一用途是指示操作是否可用。 继续以剪切对象或文本为例,此操作只有在选择了内容时才会发生作用。 如果用户在未选择任何内容的情况下尝试剪切对象或文本,则不会发生任何操作。 为了向用户指示这一点,许多应用程序通过禁用按钮和菜单项来告知用户是否可以执行某操作。 命令可以通过实现 CanExecute 方法来指示操作是否可行。 按钮可以订阅 CanExecuteChanged 事件,如果 CanExecute 返回 false 则禁用,如果 CanExecute 返回 true 则启用。

 

通俗点来说,命令模型就是事件的“升级版本”,

它可以让多个不同的源调用同一个逻辑

例如我一有个打印功能,我们将它封装成PrintDocument,当在菜单选择时、按钮点击时、快捷键按下时,我们都去执行这个功能。

它还可以控制这个功能是否可以被执行,例如,我当前未选中要打印的文档,我设置CanExecute 方法返回false,打印功能是无法被执行的。当选中了要打印的文档,设置CanExecute 方法返回true,这时候,打印功能又可以被执行了。

 

WPF 命令中的四个主要概念

WPF中的命令模型可分解为四个主要概念:命令、命令源、命令目标和命令绑定:

  • 命令:要执行的操作。

  • 命令源:调用命令的对象。

  • 命令目标:在其上执行命令的对象。

  • 命令绑定:将命令逻辑映射到命令的对象。

 

命令

命令表示应用程序任务,并且跟踪任务是否能够被执行。然而,命令实际上不包含执行应用程序任务的代码。

 

命令绑定

每个命令绑定针对用户界面的具体区域,将命令连接到相关的应用程序逻辑。这种分解的设计是非常重要的,因为单个命令可用于应用程序中的多个地方,并且在每个地方具有不同的意义。为处理这一问题,需要将同一命令与不同的命令绑定。

 

命令源

命令源触发命令。例如,Menultem和 Button都是命令源。单击它们都会执行绑定命令。

 

命令目标

命令目标是在其中执行命令的元素。例如,Paste命令可在TextBox控件中插入文本,而OpenFile命令可在 DocumentViewer 中打开文档。根据命令的本质,目标可能很重要,也可能不重要。

 

注意:如果对于这些基础概念理解起来有困难,可以先暂时跳过,直接学习后面的部分。等掌握以后,再回头来看这些基础概念。

 

MVVM中的快速示例

在前面的文章中,我们学习了数据绑定,可以在DataContext中,取到界面上的值。如果我们需要在DataContext(ViewModel层)去响应控件的事件,就需要用到Command。

 

假设有如下界面,我们想在点击按钮后,弹框输出文本框的值。

1 <StackPanel>
2     <Label Content="输入"></Label>
3     <TextBox Name="tbox"></TextBox>
4 
5     <Button Content="获取输入"></Button>
6 </StackPanel>

 

在WPF的基于事件模式的开发中,一般会响应按钮的Click事件

1 <Button Content="获取输入" Click="Button_Click"></Button>

 

然后在后台代码中对事件进行处理

1         private void Button_Click(object sender, RoutedEventArgs e)
2         {
3             MessageBox.Show(this.tbox.Text);
4         }

 

在MVVM模式开发中,我们会直接绑定到一个命令

1  <StackPanel>
2      <Label Content="输入"></Label>
3      <TextBox Text="{Binding InputText}"></TextBox>
4 
5      <Button Content="获取输入" Command="{Binding GetInputCommand}"></Button>
6  </StackPanel>

 

在ViewModel中对命令进行处理

 1 public class MainWindowViewModel 
 2 {
 3     public ICommand GetInputCommand { get; private set; }
 4 
 5     public MainWindowViewModel()
 6     {
 7         GetInputCommand = new RelayCommand(GetInput);
 8     }
 9 
10     public void GetInput()
11     {
12         MessageBox.Show(InputText);
13     }
14 }

 

运行效果

 

 

接下来详细介绍一下,如何在MVVM中使用命令模型。 

 

 

 

ICommand接口

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905486.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【读文总结】transformers circuits 随笔

【读文总结】transformers circuits 随笔内容有点太多,先截图一份 contents对 transformers 结构的重刻划 一种常见的 decoder only 的 transformer 结构如下。但是我们可以把这个 residual stream 的线抻直,将这个过程视为 transformer layer 对 residual stream 中所包含的…

vue+leaflet示例:结合geoserver实现地图空间查询(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

tinygo window安装和使用

支持的型号https://tinygo.org/docs/reference/microcontrollers/ 下载win版本https://github.com/tinygo-org/tinygo/releases 新建环境变量D:\Program_Files\tinygo\bin 验证tinygo version 在 VSCode 中创建一个新的文件,命名为 hello.gopackage main import "fmt&q…

基于ARM微处理器的无线串口集线器的总体设计

1 引言 随着21世纪科学技术的不断进步,无线与移动通信相应得到了迅猛的发展。方便快捷的无线接入和无线 互连等新概念和新产品,已逐渐融入人们的工作领域和日常生活中。由于如今对无线频率的大量使用,使无线频率资源日渐匮乏,短距离宽带无线通信技术受到世界许多国家工业界…

Pycharm中配置基于深度学习模型Yolov5的入门车辆识别Python项目

基于Yolov5的入门车辆识别 环境部署 ANACONDA环境 Anaconda官网下载:https://www.anaconda.com/download/ 进入会显示需要注册,直接跳过即可选择对应的系统版本下载安装注意选择安装位置(建议不要安装在C盘)没什么其他特别选项,直接安装即可 安装完成后使用win+r输入cmd打…

在PyCharm中提升编程效率:通义灵码(DeepSeek)助手全攻略(新版)

最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加方便!作者:ISEE小栈 转载来源:「ISEE小栈」微信公众号 最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加…

vue+leaflet示例:矢量瓦片展示(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

vue+leaflet示例:图层管理控件样式优化(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

2025西安交大集训Day4:单调栈,单调队列,线段树

2025西安交大集训Day4:单调栈,单调队列,线段树 引入 何为单调栈?顾名思义,单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 为了描述方便,以下举例及伪代码以维护一个整数的单调递增栈为例。 过程 插入 将一个元素插入单调栈时,为了维护栈的单调性,需要…

日事清甘特图制作工具:一键生成,精准管理项目周期

还在为制作甘特图而焦虑吗?别担心,日事清甘特图重磅登场,轻松帮你完美化解难题,让复杂任务规划变得简单高效!在工作中,我们很多岗位都经常需要对项目进度进行追踪,例如人事经理需要要追踪招聘进度或员工培训计划, 项目经理负责监督项目的各个阶段以保证按计划执行, 软…