相关文章推荐
胆小的领结  ·  【收藏】一起学习三维GIS—Mapbox ...·  1 年前    · 
乖乖的拐杖  ·  webservice接口调用OA方法-阿里云 ...·  1 年前    · 
成熟的沙滩裤  ·  Amazon.com: The Art ...·  2 年前    · 
不拘小节的小蝌蚪  ·  日常小发现(一)连续两次readlines( ...·  2 年前    · 
气势凌人的麦片  ·  列式表存储 - Azure Cosmos ...·  2 年前    · 
Code  ›  WPF自学入门(十一)WPF MVVM模式Command命令开发者社区
命令模式 wpf mvvm
https://cloud.tencent.com/developer/article/1493712
强悍的双杠
2 年前
黄昏前黎明后
0 篇文章

WPF自学入门(十一)WPF MVVM模式Command命令

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
黄昏前黎明后
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 小黎子数据分析 > WPF自学入门(十一)WPF MVVM模式Command命令

WPF自学入门(十一)WPF MVVM模式Command命令

作者头像
黄昏前黎明后
发布 于 2019-08-26 17:46:34
3K 0
发布 于 2019-08-26 17:46:34
举报

在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新。但是这并不是我们使用MVVM的正确方式。正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了Xaml文件和CS文件的耦合度,分离界面和业务逻辑,所以我们要尽可能的在View后台不写代码。但是这个例子中,我们将更新ViewModel的代码写在了View里,下一个例子中,我们要通过命令(Command)的来将Button的事件分离出来。

因为本文中需要使用Command命令,我们先来简单了解Command命令。在WPF中使用命令的步骤很简单

1.创建命令

2.绑定命令

3.设置命令源

4.设置命令目标

WPF中命令的核心是System.Windows.Input.ICommand接口,所有命令对象都实现了此接口。当创建自己的命令时,不能直接实现ICommand接口,而是要使用System.Windows.Input.RouteCommand类,该类已经实现了ICommand接口,所有WPF命令都是RouteCommand类的实例。在程序中处理的大部分命令不是RoutedCommand对象,而是RoutedUICommand类的实例,它继承自RouteCommand类。

WPF提供了一个很好的方式来解决事件绑定的问题--ICommand。很多控件都有Command属性,如果没有,我们可以将命令绑定到触发器上。接下来我们来先实现一个ICommand接口。ICommand需要用户定义两个方法bool CanExecute和void Execute。第一个方法可以让我们来判断是否可以执行这个命令,第二个方法就是我们具体的命令。

  1 using System;
  3 using System.Collections.Generic;
  5 using System.Linq;
  7 using System.Text;
  9 using System.Windows.Input;
 13 /***********************作者:黄昏前黎明后**********************************
 15 *   作者:黄昏前黎明后
 17 *   CLR版本:4.0.30319.42000
 19 *   创建时间:2018-04-05 22:57:56
 21 *   命名空间:Example3
 23 *   唯一标识:b9043d4c-fdd7-4e0f-a324-00f0f09286d0
 25 *   机器名称:HLPC
 27 *   联系人邮箱:hl@cn-bi.com
 31 *   描述说明:
 35 *   修改历史:
 41 *****************************************************************/
 43 namespace Example3
 47     public class RelayCommand : ICommand
 49     {
 51         #region 字段
 53         readonly Func<Boolean> _canExecute;
 55         readonly Action _execute;
 57         #endregion
 61         #region 构造函数
 63         public RelayCommand(Action execute)
 65             : this(execute, null)
 67         {
 69         }
 71         public RelayCommand(Action execute, Func<Boolean> canExecute)
 73         {
 75             if (execute == null)
 77                 throw new ArgumentNullException("execute");
 79             _execute = execute;
 81             _canExecute = canExecute;
 83         }
 85         #endregion
 89         #region ICommand的成员
 91         public event EventHandler CanExecuteChanged
 93         {
 95             add
 97             {
101                 if (_canExecute != null)
103                     CommandManager.RequerySuggested += value;
105             }
107             remove
109             {
113                 if (_canExecute != null)
115                     CommandManager.RequerySuggested -= value;
117             }
119         }
123         [DebuggerStepThrough]
125         public Boolean CanExecute(Object parameter)
127         {
129             return _canExecute == null ? true : _canExecute();
131         }
135         public void Execute(Object parameter)
137         {
139             _execute();
141         }
143         #endregion
145     }
147 }
149  

我们再在我们的NameViewModel中声明一个ICommand字段:

 1 #region 命令
 3         void UpdateNameExecute()
 5         {
 7             this.UserName = "黄昏前黎明后";
 9             this.CompanyName = "中软易通科技";
11         }
15         bool CanUpdateNameExecute()
17         {
19             return true;
21         }
 
推荐文章
胆小的领结  ·  【收藏】一起学习三维GIS—Mapbox 教程 - 哔哩哔哩
1 年前
乖乖的拐杖  ·  webservice接口调用OA方法-阿里云开发者社区
1 年前
成熟的沙滩裤  ·  Amazon.com: The Art of Debugging with GDB, DDD, and Eclipse eBook : Matloff, Norman, Peter Jay Salzman: Kindle Store
2 年前
不拘小节的小蝌蚪  ·  日常小发现(一)连续两次readlines(),第二次返回值为空 - IT小平 - 博客园
2 年前
气势凌人的麦片  ·  列式表存储 - Azure Cosmos DB for PostgreSQL | Microsoft Learn
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号