zoukankan      html  css  js  c++  java
  • 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的引用如下:

    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.  
    8. using GalaSoft.MvvmLight;
    9. using MyModel;
    10. using GalaSoft.MvvmLight.Command;
    11.  
    12. namespace MVVMLightDemo.ViewModel
    13. {
    14.     public class UserViewModel : ViewModelBase
    15.     {
    16.         /*********** 构造函数 ************/
    17.         public UserViewModel()
    18.         {
    19.             //初始化数据
    20.             //userData = User.GetUserList();
    21.             _userData = new ObservableCollection<User>();
    22.  
    23.             //初始化命令  (第一个参数是执行的命令方法,第二个参数是控制命令是否可用)
    24.             AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);   
    25.             DeleteUserCommand = new RelayCommand(ExecuteDeleteUser, CanExecuteDeleteUser);
    26.             LoadDataCommand = new RelayCommand(ExecuteLoadDataCommand);
    27.         }
    28.  
    29.         /************** 属性 **************/
    30.         private ObservableCollection<User> _userData;
    31.         /// <summary>
    32.         /// 用户信息数据
    33.         /// </summary>
    34.         public ObservableCollection<User> UserData
    35.         {
    36.             get { return _userData; }
    37.             set
    38.             {
    39.                 _userData = value;
    40.                 RaisePropertyChanged("UserData");
    41.             }
    42.         }
    43.  
    44.  
    45.         /************* 命令 ***************/
    46.         #region 新增一个用户命令:AddUserCommand
    47.         /// <summary>
    48.         /// 新增一个用户
    49.         /// </summary>
    50.         public RelayCommand AddUserCommand { get; private set; }
    51.  
    52.         //新增一个用户 命令执行方法
    53.         void ExecuteAddUser()
    54.         {
    55.             User user = new User();
    56.             user.ID = 3;
    57.             user.Name = "王旭";
    58.             user.Domain = "无/" + DateTime.Now.ToString();
    59.             UserData.Add(user);
    60.         }
    61.  
    62.         //小于5条数据时命令可用
    63.         bool CanExecuteAddUser()
    64.         {
    65.             return UserData.Count < 5;
    66.         }
    67.         #endregion
    68.  
    69.         #region 删除一个用户命令:DeleteUserCommand
    70.         /// <summary>
    71.         /// 删除一个用户
    72.         /// </summary>
    73.         public RelayCommand DeleteUserCommand { get; private set; }
    74.  
    75.         //删除一个用户 命令执行方法
    76.         void ExecuteDeleteUser()
    77.         {
    78.             UserData.RemoveAt(0);
    79.         }
    80.  
    81.         //最少保证有1条数据时命令可用
    82.         bool CanExecuteDeleteUser()
    83.         {
    84.             return UserData.Count > 1;
    85.         }
    86.         #endregion
    87.  
    88.         #region 加载数据命令:LoadDataCommand
    89.         /// <summary>
    90.         /// 加载数据
    91.         /// </summary>
    92.         public RelayCommand LoadDataCommand { get; private set; }
    93.  
    94.         //加载用户数据
    95.         void ExecuteLoadDataCommand()
    96.         {
    97.             UserData = User.GetUserList();
    98.         }
    99.         #endregion
    100.     }
    101. }
    102.  

    这里我编写的LoadDataCommand与之前写的命令的区别就是,我的RelayCommand只使用了一个参数,并没有去做命令的可用性的判断。

    至此,就完成了事件绑定到命令中,很简单吧!

    改进程序,符合MVVM设计模式

    大家还记得么,我们程序一共有两个窗口,是通过MainWindow中的一个Button按钮点击来打开的UserView窗口。是如何实现的?我们在 MainWindow.cs 中编写了ButtonClick事件…显然不符合MVVM的设计模式。

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

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

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

    本文中的程序源码下载MVVMLightDemo_3

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

  • 相关阅读:
    GO语言(golang)官方网站!
    Android官方网站!
    如何使用Gmail的别名功能?
    函数指针
    单例 ------ JAVA实现
    网络通信方案 ------ 以太网通信软硬件实现方案
    nginx的启动和关闭
    FineReport软件
    nginx的MainLine version、Stable version、Legacy versions
    linux常用命令
  • 原文地址:https://www.cnblogs.com/andrew-blog/p/3842254.html
Copyright © 2011-2022 走看看