使用 MVVMLight 命令绑定
首先,如果您希望了解更多的MVVMLight技术或希望有顺序的学习MVVMLight,请查阅目录《MVVMLight 设计模式系列使用文章》。
继上一篇文章的项目,我们实现了数据绑定到界面中。这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用。
首先我们要实现的目标是,在界面中可以点击按钮添加数据,但是最多能添加5条数据,最少保证有1条数据。也就是两个按钮哈(增加数据/删除数据)。界面如下:
在界面中我们可以看见,已经增加了5条数据,按钮“增加一条数据”已经呈现灰色不可用状态。这正是因为我们在命令中做了命令是否可用进行的限制。
MVVMLight 之 RelayCommand
在 GalaSoft.MvvmLight.Command; 命名空间中我们可以找到一个名为 RelayCommand 的类,该类包含了两种构造函数,根据情况选择。
第一种:
RelayCommand(传入要执行的方法);
执行命令的就是执行你传入的这个方法啦,详细可以参考本文的示例代码。
第二种:
RelayCommand(传入要执行的方法, 传入判断命令是否可执行的方法);
第二种构造函数基本上就是第一种的升级版,可以控制命令是否可用。
下面来看看我们的UserViewModel的完整源码
其实只看命令部分即可,理解如何构造一个完整的命令。
- 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();
- //初始化命令 (第一个参数是执行的命令方法,第二个参数是控制命令是否可用)
- AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);
- DeleteUserCommand = new RelayCommand(ExecuteDeleteUser, CanExecuteDeleteUser);
- }
- /************** 属性 **************/
- 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
- }
- }
以上包含的两个命令实现了我们前面所提交的逻辑,在这里Execute开头命名的方法是命令执行的方法,CanExecute开头的命名的方法是执行之前所判断的条件,根据你所给的返回值来决定这个命令是否可用。至于方法命名方式你要随意,看习惯咯。
是不是很简单?没错,就这么简单,下面我们再看看View吧。
下面是UserView.xaml的XAML代码
相对上一篇文章其实就加了两个按钮而已。
- <Window x:Class="MVVMLightDemo.View.UserView"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="UserView" Height="300" Width="300">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <StackPanel Grid.Row="0">
- <Button Command="{Binding AddUserCommand}">增加一条数据</Button>
- <Button Command="{Binding DeleteUserCommand}">删除一条数据</Button>
- </StackPanel>
- <DataGrid Grid.Row="1" ItemsSource="{Binding UserData}"></DataGrid>
- </Grid>
- </Window>
在Button元素标签中使用 Command属性,将其绑定我们指定命令名称即可。
小提示:别忘了给自己的命令设置 public ,否则是没法成功绑定的。
至此我们就完成了对MVVMLight命令绑定的一个了解,没错还有一些问题我们现在没法解决。例如,在TextBox Lable Window 之类的没有Command命令。我们如何做,下一篇文章会详细对此进行阐述,我们将改进程序的加载方式,希望在界面呈现之后加载数据。
所以我们会在Load的时候加载数据,但是不违背MVVM设计模式的思想之代码分离。所以我们不会在View中编写代码实现,而是通过事件绑定命令的方式实现。
本文示例源码下载:MVVMLightDemo_2
更多的MVVMLight使用,请返回查阅《MVVMLight 设计模式系列使用文章》,欢迎各位Coder补充。
转载请注明:王旭博客 » 使用 MVVMLight 命令绑定
使用 MVVMLight 命令绑定的更多相关文章
- 使用 MVVMLight 命令绑定(转)
继上一篇文章的项目,我们实现了数据绑定到界面中.这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用. 首先我们要实现的目标是,在界 ...
- 将命令绑定到事件中(WPF)
绑定到指定名称控件的——>指定属性上 <i:Interaction.Triggers> <i:EventTrigger E ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】
今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...
- C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- WPF中的命令与命令绑定导航
1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)
- MVVM模式的命令绑定
命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的, ...
- PIE SDK图层树右键菜单与命令绑定
1. 功能简介 上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些.采用什么 ...
随机推荐
- 微信wap开发---页面自适应大小
<meta name="viewport" content="width=device-width, initial-scale=0.5, minimum-scal ...
- GetLastError()返回值大全
[0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无效.[7]-存储控制块被损坏.[8]-存储 ...
- 一款基于jquery滑动后固定于顶部的导航
之前已为大家介绍了好多css3实现的导航菜单.今天分享一款基于jquery滑动后固定于顶部的导航.这款导航的特点是初始位于顶部下面一百个像素,当鼠标滚动时到下方,导航一直处于顶部.效果图如下: 在线预 ...
- Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化
Tomcat Connector的三种不同的执行模式性能相差非常大,有人測试过的结果例如以下: 这三种模式的不同之处例如以下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. ...
- 【C#】解析XML
最近在尝试用WPF搞点桌面小应用. C#中使用System.Xml.XmlDocument类对XML文件进行操作. 文档详情如下: https://msdn.microsoft.com/en-us/l ...
- invalid conversion from 'void* (*)()' to 'void* (*)(void*)'
void *thread1() ], NULL, thread1, NULL)) != ) 提示:invalid conversion from 'void* (*)()' to 'void* (*) ...
- 细数JDK里的设计模式<转>
这也是篇老文了,相信很多人也看过.前面那些废话就不翻译了,直接切入正题吧~ 结构型模式: 适配器模式: 用来把一个接口转化成另一个接口. java.util.Arrays#asList() javax ...
- NFS服务的端口分配
常规的一些NFS服务设置我们已经了解了.那么对于端口问题,很多朋友并不是很清楚.这里我们就来详细介绍一下端口的分配.portmapper在NFS服务启动的时候给每一个NFS服务分配了一个动态的端口,如 ...
- Android中新建的文件在R没有显示相应的文件解决的方法总结
我们有时会发现当我们新建一个文件或者目录在Generated Java Files(gen)文件的R.java中没有生成相应的静态类或者静态属性.此时你可能出现了以下的情况.注意參照解决. 一般正常情 ...
- js学习笔记20----addClass,removeClass函数封装
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...