将命令绑定到事件中(WPF)
绑定到指定名称控件的——>指定属性上
<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的引用如下:
- xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
 
这样我们就可以在View中使用它了,我在 UserViewModel.cs 中编写了一个 LoadDataCommand 的命令来加载数据。所以按照我们之前所想做的就是在窗口 Loaded 加载完之后加载数据,我们就将其命令绑定到 Loaded 事件中,代码如下:
- <!--让Load事件触发LoadDataCommand命令-->
 - <i:Interaction.Triggers>
 - <i:EventTrigger EventName="Loaded">
 - <i:InvokeCommandAction Command="{Binding LoadDataCommand}" />
 - </i:EventTrigger>
 - </i:Interaction.Triggers>
 
将这段代码放在<Window>标签之中即可,同理如果你要在其他元素中的事件进行绑定,那么就放到其元素的标签中即可。
关于如何编写LoadDataCommand呢,相信你看了上一篇文章,相信对你来说是很简单的,不过我还是把代码贴出来方便大家吧 :)
下面是UserViewModel.cs的源码
- using System;
 - using System.Collections.Generic;
 - using System.Collections.ObjectModel;
 - using System.Linq;
 - using System.Text;
 - using System.Threading.Tasks;
 - using GalaSoft.MvvmLight;
 - using MyModel;
 - using GalaSoft.MvvmLight.Command;
 - namespace MVVMLightDemo.ViewModel
 - {
 - public class UserViewModel : ViewModelBase
 - {
 - /*********** 构造函数 ************/
 - public UserViewModel()
 - {
 - //初始化数据
 - //userData = User.GetUserList();
 - _userData = new ObservableCollection<User>();
 - //初始化命令 (第一个参数是执行的命令方法,第二个参数是控制命令是否可用)
 - AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);
 - DeleteUserCommand = new RelayCommand(ExecuteDeleteUser, CanExecuteDeleteUser);
 - LoadDataCommand = new RelayCommand(ExecuteLoadDataCommand);
 - }
 - /************** 属性 **************/
 - private ObservableCollection<User> _userData;
 - /// <summary>
 - /// 用户信息数据
 - /// </summary>
 - public ObservableCollection<User> UserData
 - {
 - get { return _userData; }
 - set
 - {
 - _userData = value;
 - RaisePropertyChanged("UserData");
 - }
 - }
 - /************* 命令 ***************/
 - #region 新增一个用户命令:AddUserCommand
 - /// <summary>
 - /// 新增一个用户
 - /// </summary>
 - public RelayCommand AddUserCommand { get; private set; }
 - //新增一个用户 命令执行方法
 - void ExecuteAddUser()
 - {
 - User user = new User();
 - user.ID = 3;
 - user.Name = "王旭";
 - user.Domain = "无/" + DateTime.Now.ToString();
 - UserData.Add(user);
 - }
 - //小于5条数据时命令可用
 - bool CanExecuteAddUser()
 - {
 - return UserData.Count < 5;
 - }
 - #endregion
 - #region 删除一个用户命令:DeleteUserCommand
 - /// <summary>
 - /// 删除一个用户
 - /// </summary>
 - public RelayCommand DeleteUserCommand { get; private set; }
 - //删除一个用户 命令执行方法
 - void ExecuteDeleteUser()
 - {
 - UserData.RemoveAt(0);
 - }
 - //最少保证有1条数据时命令可用
 - bool CanExecuteDeleteUser()
 - {
 - return UserData.Count > 1;
 - }
 - #endregion
 - #region 加载数据命令:LoadDataCommand
 - /// <summary>
 - /// 加载数据
 - /// </summary>
 - public RelayCommand LoadDataCommand { get; private set; }
 - //加载用户数据
 - void ExecuteLoadDataCommand()
 - {
 - UserData = User.GetUserList();
 - }
 - #endregion
 - }
 - }
 
这里我编写的LoadDataCommand与之前写的命令的区别就是,我的RelayCommand只使用了一个参数,并没有去做命令的可用性的判断。
至此,就完成了事件绑定到命令中,很简单吧!
改进程序,符合MVVM设计模式
大家还记得么,我们程序一共有两个窗口,是通过MainWindow中的一个Button按钮点击来打开的UserView窗口。是如何实现的?我们在 MainWindow.cs 中编写了Button的Click事件…显然不符合MVVM的设计模式。
我们下一篇则就是改进这个地方,并且是一个MVVMLight的非常有趣实用的技术点:消息通知。
有兴趣的可以返回目录《关于 MVVMLight 设计模式系列》进入下一篇文章。
System.Windows.Interactivity.dll 文件下载:System.Windows.Interactivity
本文中的程序源码下载:MVVMLightDemo_3
将命令绑定到事件中(WPF)的更多相关文章
- 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】
		
今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...
 - WPF 在事件中绑定命令(不可以在模版中绑定命令)
		
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...
 - WPF 在事件中绑定命令
		
导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...
 - CPF 入门教程 - 数据绑定和命令绑定(二)
		
CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...
 - 整理:WPF中应用附加事件制作可以绑定命令的其他事件
		
原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...
 - MVVM模式解析和在WPF中的实现(三)命令绑定
		
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
 - WPF Prism框架下基于MVVM模式的命令、绑定、事件
		
Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...
 - WPF中的命令与命令绑定(二)
		
原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二) 周银辉在WPF中,命令(Commandi ...
 - WPF中的命令与命令绑定导航
		
1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)
 
随机推荐
- 让linux进程后台运行、会话断开不退出
			
方法一:nohup ping www.ibm.com & 可改变进程的父进程号方法二:setsid ping www.ibm.com 可改变进程的父进程号方法三:(ping www.ibm.c ...
 - samba了解
			
1. samba是一个网络服务器,用于Linux和Windows之间共享文件 2,amba服务的启动.停止.重启 service smb start|stop|restart3. 掌握samba ...
 - 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁
			
并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...
 - 002-java反编译工具jd-gui
			
官网:https://github.com/java-decompiler 下载:https://github.com/java-decompiler/jd-gui/releases 使用: java ...
 - 剑指offer 面试15题
			
面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...
 - linux中获取系统时间的几种方法
			
asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime 表头文件 #include<time.h> 定义函数 char * asc ...
 - 2015.7.7——跌停板做T,就算要搏跌停反弹也要看卖一档压力啊
			
1.今天中色股份和以往不同买卖盘为正!————今天要重新观察这种新常态下的盘面运作 是否会出现如2015.7.6中描述的“前期错过了皮城中的黄金买点,...其实只要买卖盘为负,后期还会有再次尝试该低点 ...
 - loadrunner之脚本篇——录制方式HTML-based和URL-based Script
			
A. HTML-based Script 针对 Web (HTTP/HTML)虚拟用户的缺省录制级别.它指示VuGen录制当前web页面上下文中的HTML action.录制会话期间并不录制所有资 ...
 - 动手动脑:String.equals()的使用方法
			
public class StringEquals { /** * @param args the command line arguments */ public static void main( ...
 - 每天一个Linux命令(38)top命令
			
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. (1)用法: 用法: top [参数] top是 ...