导航:MVVMLight系列文章目录:《关于 MVVMLight 设计模式系列》html
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友能够跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中。设计模式
上一篇中咱们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是如何构建使用的还不够,不少状况下咱们都须要在某个事件触发的时候才去触发命令,因此将命令绑定到事件上是很是有效的作法,下面咱们来接着实现将命令绑定到事件中。函数

WPF实现命令绑定到事件
使用 System.Windows.Interactivity.dll
中的 Interaction
能够帮助咱们实现对命令的绑定,因此咱们须要引用该文件到项目中,这个文件是微软的Blend中提供的。(若是你在VS中 NuGet 了MVVMLight,那么这个组件也会自动引用到项目中的) 若是你找不到该文件的话,我会在文章底部提供System.Windows.Interactivity.dll
文件的下载。spa
引用 System.Windows.Interactivity.dll
程序集以后,咱们在 View
中添加xmlns的引用以下:设计
- xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
这样咱们就能够在View中使用它了,我在 UserViewModel.cs 中编写了一个 LoadDataCommand 的命令来加载数据。因此按照咱们以前所想作的就是在窗口 Loaded 加载完以后加载数据,咱们就将其命令绑定到 Loaded 事件中,代码以下:code
- <!--让Load事件触发LoadDataCommand命令-->
- <i:Interaction.Triggers>
- <i:EventTrigger EventName="Loaded">
- <i:InvokeCommandAction Command="{Binding LoadDataCommand}" />
- </i:EventTrigger>
- </i:Interaction.Triggers>
将这段代码放在<Window>标签之中便可,同理若是你要在其余元素中的事件进行绑定,那么就放到其元素的标签中便可。xml
关于如何编写LoadDataCommand
呢,相信你看了上一篇文章,相信对你来讲是很简单的,不过我仍是把代码贴出来方便你们吧 :)htm
下面是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 在事件中绑定命令