其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中

上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是如何构建使用的还不够,很多情况下我们都需要在某个事件触发的时候才去触发命令,所以将命令绑定到事件上是非常有效的做法,下面我们来接着实现将命令绑定到事件中。

WPF实现命令绑定到事件

使用 System.Windows.Interactivity.dll 中的 Interaction 可以帮助我们实现对命令的绑定,所以我们需要引用该文件到项目中,这个文件是微软的Blend中提供的。(如果你在VS中 NuGet 了MVVMLight,那么这个组件也会自动引用到项目中的)  如果你找不到该文件的话,我会在文章底部提供System.Windows.Interactivity.dll文件的下载。

引用 System.Windows.Interactivity.dll 程序集之后,我们在 View 中添加xmlns的引用如下:

  1. xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

这样我们就可以在View中使用它了,我在 UserViewModel.cs 中编写了一个 LoadDataCommand 的命令来加载数据。所以按照我们之前所想做的就是在窗口 Loaded 加载完之后加载数据,我们就将其命令绑定到  Loaded 事件中,代码如下:

  1. <!--让Load事件触发LoadDataCommand命令-->
  2. <i:Interaction.Triggers>
  3. <i:EventTrigger EventName="Loaded">
  4. <i:InvokeCommandAction Command="{Binding LoadDataCommand}" />
  5. </i:EventTrigger>
  6. </i:Interaction.Triggers>

将这段代码放在<Window>标签之中即可,同理如果你要在其他元素中的事件进行绑定,那么就放到其元素的标签中即可。

关于如何编写LoadDataCommand呢,相信你看了上一篇文章,相信对你来说是很简单的,不过我还是把代码贴出来方便大家吧 :)

下面是UserViewModel.cs的源码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using GalaSoft.MvvmLight;
  8. using MyModel;
  9. using GalaSoft.MvvmLight.Command;
  10. namespace MVVMLightDemo.ViewModel
  11. {
  12. public class UserViewModel : ViewModelBase
  13. {
  14. /*********** 构造函数 ************/
  15. public UserViewModel()
  16. {
  17. //初始化数据
  18. //userData = User.GetUserList();
  19. _userData = new ObservableCollection<User>();
  20. //初始化命令  (第一个参数是执行的命令方法,第二个参数是控制命令是否可用)
  21. AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);
  22. DeleteUserCommand = new RelayCommand(ExecuteDeleteUser, CanExecuteDeleteUser);
  23. LoadDataCommand = new RelayCommand(ExecuteLoadDataCommand);
  24. }
  25. /************** 属性 **************/
  26. private ObservableCollection<User> _userData;
  27. /// <summary>
  28. /// 用户信息数据
  29. /// </summary>
  30. public ObservableCollection<User> UserData
  31. {
  32. get { return _userData; }
  33. set
  34. {
  35. _userData = value;
  36. RaisePropertyChanged("UserData");
  37. }
  38. }
  39. /************* 命令 ***************/
  40. #region 新增一个用户命令:AddUserCommand
  41. /// <summary>
  42. /// 新增一个用户
  43. /// </summary>
  44. public RelayCommand AddUserCommand { get; private set; }
  45. //新增一个用户 命令执行方法
  46. void ExecuteAddUser()
  47. {
  48. User user = new User();
  49. user.ID = 3;
  50. user.Name = "王旭";
  51. user.Domain = "无/" + DateTime.Now.ToString();
  52. UserData.Add(user);
  53. }
  54. //小于5条数据时命令可用
  55. bool CanExecuteAddUser()
  56. {
  57. return UserData.Count < 5;
  58. }
  59. #endregion
  60. #region 删除一个用户命令:DeleteUserCommand
  61. /// <summary>
  62. /// 删除一个用户
  63. /// </summary>
  64. public RelayCommand DeleteUserCommand { get; private set; }
  65. //删除一个用户 命令执行方法
  66. void ExecuteDeleteUser()
  67. {
  68. UserData.RemoveAt(0);
  69. }
  70. //最少保证有1条数据时命令可用
  71. bool CanExecuteDeleteUser()
  72. {
  73. return UserData.Count > 1;
  74. }
  75. #endregion
  76. #region 加载数据命令:LoadDataCommand
  77. /// <summary>
  78. /// 加载数据
  79. /// </summary>
  80. public RelayCommand LoadDataCommand { get; private set; }
  81. //加载用户数据
  82. void ExecuteLoadDataCommand()
  83. {
  84. UserData = User.GetUserList();
  85. }
  86. #endregion
  87. }
  88. }

这里我编写的LoadDataCommand与之前写的命令的区别就是,我的RelayCommand只使用了一个参数,并没有去做命令的可用性的判断。

至此,就完成了事件绑定到命令中,很简单吧!

改进程序,符合MVVM设计模式

大家还记得么,我们程序一共有两个窗口,是通过MainWindow中的一个Button按钮点击来打开的UserView窗口。是如何实现的?我们在MainWindow.cs 中编写了ButtonClick事件…显然不符合MVVM的设计模式。

我们下一篇则就是改进这个地方,并且是一个MVVMLight的非常有趣实用的技术点:消息通知。

有兴趣的可以返回目录《关于 MVVMLight 设计模式系列》进入下一篇文章。

System.Windows.Interactivity.dll 文件下载System.Windows.Interactivity

本文中的程序源码下载MVVMLightDemo_3

转载请注明:王旭博客 » WPF 在事件中绑定命令

WPF 在事件中绑定命令(不可以在模版中绑定命令)的更多相关文章

  1. 8. Smarty3:模版中的内置函数

    smarty3中对内置函数的修改比較大,加入了很多新的功能:变量声明.表达式,流程控制,函数.数组等.可是建议不要在模版中去使用过于复杂的逻辑,而是要尽量将一些程序设计逻辑写到PHP中,并在模版中採用 ...

  2. WPF 在事件中绑定命令

    导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...

  3. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. WPF 弱事件

    因为在接触WPF的过程中追查INotifyPropertyChanged的通知原理的时候,发现了 PropertyChangedEventManager这个类,它是继承与WeakEventManage ...

  5. WPF路由事件

    ​    这节讲一下WPF中的路由事件(Routed Event). [什么是事件] 在了解路由事件前,我们应先来了解一下什么是事件(Event). 在Windows系统中,像鼠标单击,双击,移动这样 ...

  6. MVC5中后台提供Json,前台处理Json,绑定给Dropdownlist的例子

    MVC5中后台提供Json,前台处理Json,绑定给Dropdownlist的例子: 前端: 我们以前在前端定义了两个控件: <div class="row"> < ...

  7. 重新想象 Windows 8 Store Apps (52) - 绑定: 与 Element Model Indexer Style RelativeSource 绑定, 以及绑定中的数据转换

    [源码下载] 重新想象 Windows 8 Store Apps (52) - 绑定: 与 Element Model Indexer Style RelativeSource 绑定, 以及绑定中的数 ...

  8. WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...

  9. Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

随机推荐

  1. 编程零基础应当如何开始学习 Python?

    提前说一下,这篇福利多多,别的不说,直接让你玩回最有手感的怀旧游戏,参数贴图很方便自己可以根据喜好修改哦. 本篇通过以下四块展开,提供大量资源对应. 选一个好版本 有没有看过<在下坂本,有何贵干 ...

  2. git和github的重要性

    Git是一款免费.开源的分布式版本控制系统,github是全球最大的同性交友平台啊呸,说错了github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就 ...

  3. 201521123107 《Java程序设计》第1周学习总结

    第1周学习总结 1.本周学习总结 本周我们正式开始了对一门新的编程语言java的学习.本周的主要内容是初步了解了java的发展过程,java具有简约且简单 .平台无关性等优点.java的3个关键的工具 ...

  4. 201521123110 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  5. 201521123075 《Java程序设计》第2周学习总结

    1. 本周学习总结 各种数据类型,运算符,表达式的使用: 字符串String类; 对数组对象和字符串对象的运用. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码 ...

  6. 2015211230108《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally的作用: 1.确定程序 ...

  7. TCP/IP协议:OSI七层模型、TCP/IP四层模型的对比

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  8. 对Java的初识

    什么是计算机程序:    为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.(简单来说就是记算机为完成某些功能生产的一系列有序指令集合); Java的来历:  Java的初期开发早在 ...

  9. css3新属性的学习使用

    display 可选值:none隐藏元素: block显示为块级元素: inline显示为行级元素 inlineblock显示为内联块级元素,本身将是一个行级元素,但是拥有 块级元素的所有属性,比如宽 ...

  10. ng-file-upload(在单文件选择,并且通过点击“上传”按钮上传文件的情况下,如何在真正选择文件之前保留上一文件信息?)

    文章前面研究ng-file-upload可能涉及指令: You can use ng-model or ngf-change instead of specifying function for ng ...