导航:MVVMLight系列文章目录:《关于 MVVMLight 设计模式系列

其实这也不属于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. WPF 在事件中绑定命令(不可以在模版中绑定命令)

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

  2. WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension

    问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...

  3. js事件中绑定另一事件导致事件多次执行

    1.html代码 <input type="button" value="add"> <input type="button&quo ...

  4. WPF数据模板中绑定事件不触发问题

    今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...

  5. wpf DATAgrid模板中button 命令绑定以及命令参数绑定

    场景:视频上传功能,上传列表使用DataGrid控件,视频有不同的状态对应不同的操作,DataGrid中最后一列为操作列,里面是Button控件.希望点击Button后执行对应的操作,但是设置Butt ...

  6. 继续聊WPF——获取ComboBox中绑定的值

    千万不要认为WPF中的数据绑定会很复杂,尽管它的确比Winform程序灵活多了,但其本质是不变的,特别是ComboBox控件,我们知道在Winform中对该控件的有两个专为数据绑定而设定的属性——Di ...

  7. WPF在ViewModel中绑定按钮点击(CommandBase定义)

    定义CommandBase public class CommandBase:ICommand { private readonly Action<object> _commandpara ...

  8. 模板列onclick事件中绑定跳转页参数(onclick location.href Eval)

    <asp:GridView runat="server" ID="gvCheckList" AutoGenerateColumns="false ...

  9. 将命令绑定到事件中(WPF)

    绑定到指定名称控件的——>指定属性上 <i:Interaction.Triggers>                            <i:EventTrigger E ...

随机推荐

  1. 《SPARK/TACHYON:基于内存的分布式存储系统》-史鸣飞(英特尔亚太研发有限公司大数据软件部工程师)

    史鸣飞:大家好,我是叫史鸣飞,来自英特尔公司,接下来我向大家介绍一下Tachyon.我事先想了解一下大家有没有听说过Tachyon,或者是对Tachyon有没有一些了解?对Spark呢? 首先做一个介 ...

  2. js 的登录验证

    $scope.startLogin = function () { console.log('loginTimeHelper:startLogin: ' + getCurrentTime()); ef ...

  3. sqlserver 多排序的问题

    sql 执行默认执行排序的第一个字段,如果结果集中含有重复的列的字段,才会按照2...N个字段进行排序,没有重复列多排序无效果

  4. nio入门教程

    1.通过拿NIO和传统IO做对比来了解NIO 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字 ...

  5. (转)Linux下PS命令详解

    (转)Linux下PS命令详解 整理自:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74654 要对系统中进 ...

  6. iio adc转换应用编写

    #include <stdio.h>        #include <stdlib.h>         #include <fcntl.h>         # ...

  7. HAProxy+Varnish+LNMP实现高可用负载均衡动静分离集群部署

    HAProxy高可用负载均衡集群部署 基本信息: 系统平台:VMware WorkStation 系统版本: CentOS Linux release 7.2.1511 (Core) 内核版本: 3. ...

  8. LINQ操作符二:SelectMany

    SelectMany操作符提供了将多个from子句组合起来的功能,相当于数据库中的多表连接查询,它将每个对象的结果合并成单个序列. 示例: student类: using System; using ...

  9. 专题实验 EXP & IMP

    导入导出时 oracle 提供的实用工具, 如果这些被导出的对象还存在其他的相关对象, 比如要被导出的表上还存在索引, 注释等, 则导出工具会自动将这些相关的对象也提取出来, 并放入到导出的文件中去. ...

  10. spring boot 拦截器之WebMvcConfigurerAdapter

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   上一篇我们讲到了拦截器,我们也简单的讲解到了WebMvcConfigurerAdapter这个拦截器.本篇我们来对Web ...