个人随笔
技术改变世界

WPF 在事件中绑定命令

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

 

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

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

MVVMLight Command Binding

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 中编写了ButtonClick事件…显然不符合MVVM的设计模式。

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

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

 

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

本文中的程序源码下载MVVMLightDemo_3

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

分享到:更多 ()

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    在学WPF,非常感谢你的教程,很实用。

    小手冰凉9个月前 (07-06)回复