绑定到指定名称控件的——>指定属性上

<i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseDoubleClick">
                                <i:InvokeCommandAction Command="{Binding OpenChildrenCommand}" CommandParameter="{Binding ElementName=listbox_org,Path=SelectedItem}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>

转自链接(王旭博客 » WPF 在事件中绑定命令):http://blog.csdn.net/andrew_wx/article/details/37757187 (该文章是《关于 MVVMLight 设计模式系列》中的一节)

本文主要介绍如何在WPF中实现将命令绑定到事件中,很多情况下我们都需要在某个事件触发的时候才去触发命令,所以将命令绑定到事件上是非常有效的做法,下面我们来接着实现将命令绑定到事件中。

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)的更多相关文章

  1. 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】

    今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...

  2. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

  3. WPF 在事件中绑定命令

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

  4. CPF 入门教程 - 数据绑定和命令绑定(二)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...

  5. 整理:WPF中应用附加事件制作可以绑定命令的其他事件

    原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...

  6. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. WPF Prism框架下基于MVVM模式的命令、绑定、事件

    Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...

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

    原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二)                                              周银辉在WPF中,命令(Commandi ...

  9. WPF中的命令与命令绑定导航

    1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)

随机推荐

  1. flask信号

    骚师博客:信号 信号你就可以这么理解,请求比喻成赛车,请求走的流程就是赛车道,而信号坐落在赛车道上的加油站和维修站,信号注册的函数好比维修站的人,每经过维修站并且维修站里有人就进行维修 信号这里理解: ...

  2. 内置函数:sorted 用法

    内置函数——sorted  对list.dict进行排序,Python提供了两个方法 对给定的List L进行排序,方法1: 用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2: ...

  3. SUBMIT RM07DOCS【MB51】 获取返回清单,抓取标准报表数据

    *&---------------------------------------------------------------------* *& Report YT_SUBMIT ...

  4. OpenGL学习进程(6)第四课:点、边和图形(一)点

    本节是OpenGL学习的第四个课时,下面介绍OpenGL点的相关知识:     (1)点的概念:     数学上的点,只有位置,没有大小.但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点 ...

  5. 给二维码(图片)添加文字(水印),让生成的二维码中间带logo

    <?php //生成二维码 require_once IA_ROOT . '/framework/library/qrcode/phpqrcode.php'; QRcode::png($url, ...

  6. linux命令详解之df(6/19)

    df命令作用是列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多少空间. df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当前已挂载文件系 ...

  7. 如何计算android设备的屏幕物理尺寸

    https://segmentfault.com/q/1010000002794179 通过android提供的接口,我们可以获取到如下的信息:int densityDpi = mContext.ge ...

  8. JS以指定格式获取当前日期

    //获取当前时间,格式YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = "-& ...

  9. samba Doc

    Samba-HOWTO-Collection中文翻译版(2.20) 2013年08月23日 ⁄ 综合 ⁄ 共 19460字 ⁄ 字号 小 中 大 ⁄ 评论关闭 Samba计划文档 (初稿) Samba ...

  10. copy deepcopy辨析

    copy deepcopy讲的是复制源对象的改变对copy出来的对象的影响: 我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在. 所以改变原有被复制对象不会对已经复制 ...