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 在事件中绑定命令

  • 相关阅读:
    461. Hamming Distance
    342. Power of Four
    326. Power of Three
    368. Largest Divisible Subset java solutions
    95. Unique Binary Search Trees II java solutions
    303. Range Sum Query
    160. Intersection of Two Linked Lists java solutions
    88. Merge Sorted Array java solutions
    67. Add Binary java solutions
    14. Longest Common Prefix java solutions
  • 原文地址:https://www.cnblogs.com/andrew-blog/p/3842254.html
Copyright © 2011-2022 走看看