首先,如果您希望了解更多的MVVMLight技术或希望有顺序的学习MVVMLight,请查阅目录《MVVMLight 设计模式系列使用文章》。

继上一篇文章的项目,我们实现了数据绑定到界面中。这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用。

首先我们要实现的目标是,在界面中可以点击按钮添加数据,但是最多能添加5条数据,最少保证有1条数据。也就是两个按钮哈(增加数据/删除数据)。界面如下:

在界面中我们可以看见,已经增加了5条数据,按钮“增加一条数据”已经呈现灰色不可用状态。这正是因为我们在命令中做了命令是否可用进行的限制。

MVVMLight 之 RelayCommand

GalaSoft.MvvmLight.Command; 命名空间中我们可以找到一个名为 RelayCommand 的类,该类包含了两种构造函数,根据情况选择。

第一种:

RelayCommand(传入要执行的方法);

执行命令的就是执行你传入的这个方法啦,详细可以参考本文的示例代码。

第二种:

RelayCommand(传入要执行的方法, 传入判断命令是否可执行的方法);

第二种构造函数基本上就是第一种的升级版,可以控制命令是否可用。

下面来看看我们的UserViewModel的完整源码

其实只看命令部分即可,理解如何构造一个完整的命令。

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

以上包含的两个命令实现了我们前面所提交的逻辑,在这里Execute开头命名的方法是命令执行的方法,CanExecute开头的命名的方法是执行之前所判断的条件,根据你所给的返回值来决定这个命令是否可用。至于方法命名方式你要随意,看习惯咯。

是不是很简单?没错,就这么简单,下面我们再看看View吧。

下面是UserView.xaml的XAML代码

相对上一篇文章其实就加了两个按钮而已。

  1. <Window x:Class="MVVMLightDemo.View.UserView"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="UserView" Height="300" Width="300">
  5. <Grid>
  6. <Grid.RowDefinitions>
  7. <RowDefinition Height="auto" />
  8. <RowDefinition Height="*" />
  9. </Grid.RowDefinitions>
  10. <StackPanel Grid.Row="0">
  11. <Button Command="{Binding AddUserCommand}">增加一条数据</Button>
  12. <Button Command="{Binding DeleteUserCommand}">删除一条数据</Button>
  13. </StackPanel>
  14. <DataGrid Grid.Row="1" ItemsSource="{Binding UserData}"></DataGrid>
  15. </Grid>
  16. </Window>

在Button元素标签中使用 Command属性,将其绑定我们指定命令名称即可。

小提示:别忘了给自己的命令设置 public ,否则是没法成功绑定的。

至此我们就完成了对MVVMLight命令绑定的一个了解,没错还有一些问题我们现在没法解决。例如,在TextBox Lable Window 之类的没有Command命令。我们如何做,下一篇文章会详细对此进行阐述,我们将改进程序的加载方式,希望在界面呈现之后加载数据。

所以我们会在Load的时候加载数据,但是不违背MVVM设计模式的思想之代码分离。所以我们不会在View中编写代码实现,而是通过事件绑定命令的方式实现。

本文示例源码下载:MVVMLightDemo_2

更多的MVVMLight使用,请返回查阅《MVVMLight 设计模式系列使用文章》,欢迎各位Coder补充。

转载请注明:王旭博客 » 使用 MVVMLight 命令绑定

使用 MVVMLight 命令绑定的更多相关文章

  1. 使用 MVVMLight 命令绑定(转)

    继上一篇文章的项目,我们实现了数据绑定到界面中.这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用. 首先我们要实现的目标是,在界 ...

  2. 将命令绑定到事件中(WPF)

    绑定到指定名称控件的——>指定属性上 <i:Interaction.Triggers>                            <i:EventTrigger E ...

  3. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  4. 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】

    今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...

  5. C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...

  6. C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...

  7. WPF中的命令与命令绑定导航

    1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)

  8. MVVM模式的命令绑定

    命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的, ...

  9. PIE SDK图层树右键菜单与命令绑定

    1.   功能简介 上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些.采用什么 ...

随机推荐

  1. 基于Cocos2d-x学习OpenGL ES 2.0之多纹理

    没想到原文出了那么多错别字,实在对不起观众了.介绍opengl es 2.0的不多.相信介绍基于Cocos2d-x学习OpenGL ES 2.0之多纹理的,我是独此一家吧.~~ 子龙山人出了一个系列: ...

  2. 常见电源品牌大揭密(转贴自pceva,作者royalk)

    常见电源品牌大揭密(转贴自pceva,作者royalk) 介绍电源品牌代工厂之前,必须介绍一下电源分类: 标准电源 标准电源就是电脑城装机用得最多的电源,性能正常,外观一般,原生接线,也没有什么风扇停 ...

  3. IDEA用maven打war包

    打包其实很简单: 把tomcat停掉,点击Maven Projects ,点击clean , 点击package 自动打包完成. 查看包位置: 这是包的位置,通过查看PATH就可以知道你的包在哪里了. ...

  4. mysql too many max_connections

    debian 环境 mysql  MySQL Community Server 5.6.27 首先修改 my.cnf文件  全局查找  find / -name my.cnf* [mysqld] 配置 ...

  5. <a>设置长宽

    因为只有块元素才会有物理属性,在css世界里边,有三种形态的东西, 1. 块元素. 特性:有物理属性,width,height写值起作用,而且要占据一行.2. 内联元素. 特性:没有物理属性.但是ma ...

  6. Android实例-ImageList与Image的应用

    procedure TForm1.Button1Click(Sender: TObject);var  oSizeF: TSizeF;beginoSizeF.cx:=10;//发现这个值小了会增加马赛 ...

  7. MAC上类apt-get工具brew的安装与使用

    对于习惯了linux系统的人来说,使用yum或者apt-get来在线安装软件是一件非常愉快的事情.这些工具能够解决依赖问题.使得安装过程变得简单快捷. 在使用MAC的时候,也会想:MAC OS上有没有 ...

  8. 修改 login的串口重定向

     1 在console-telnet 使用vi工具编辑 /etc/inittab 文件  vi /etc/inittab (回车)2 按 i 进入编辑模式:3 将文件中的ttyS0  改为 ttyS3 ...

  9. FastDFS - 文件服务器学习资料

    FastDFS搭建及java整合代码 CentOS 6.5下 FastDFS结合Nginx插件实现图片http访问 图片服务器fastDFS的搭建以及配置 nginx fastdfs 配置后 上传成功 ...

  10. CodeIgniter(3.1.4)框架-url重写,去除index.php

    1.开启Apache重写url模块. *相应内容可百度. 2.在项目根目录下创建[.htaccess]文件,其内容如下: RewriteEngine On RewriteCond %{REQUEST_ ...