RelayCommand

Mvvm最大的特点就是分离了View和ViewModel,将数据的显示和业务逻辑分开。使用WPF的Binding,我们不仅能够

将数据从ViewModel绑定到View,同时也可以将行为绑定到View。例如,在主界面上点击一个按钮,这个按钮实际完成

的操作是ViewModel中对应的方法。这里我们用到Mvvm框架中的RelayCommand。下面是几种常用的情况

不带参数的RelayCommand

点击按钮,弹出消息框

AppView.xaml

  1. <Grid>
  2. <Button Width="100" Height="30" Command="{Binding ShowMsgCommand}"></Button>
  3. </Grid>

AppViewModel.cs

  1. /// <summary>
  2. /// 显示消息命令
  3. /// </summary>
  4. public RelayCommand ShowMsgCommand
  5. {
  6. get;
  7. set;
  8. }
  9. public AppViewModel()
  10. {
  11. //初始化命令
  12. ShowMsgCommand= new RelayCommand(ShowMsg);
  13. }
  14. /// <summary>
  15. /// 命令具体实现
  16. /// </summary>
  17. private void ShowMsg()
  18. {
  19. MessageBox.Show("HelloWorld!");
  20. }

带参数的RelayCommand

点击按钮,显示我们输入的文本

AppView.xaml

  1. <Grid>
  2. <TextBox x:Name="txt" Width="100" Height="30"></TextBox>
  3. <Button Width="100" Height="30" Command="{Binding ShowTxtCommand}" CommandParameter="{Binding ElementName=txt,Path=Text}" Margin="0,100,0,0"></Button>
  4. </Grid>

AppViewModel.cs

  1. /// <summary>
  2. /// 显示消息命令
  3. /// </summary>
  4. public RelayCommand<string> ShowTxtCommand
  5. {
  6. get;
  7. set;
  8. }
  9. public AppViewModel()
  10. {
  11. //初始化命令
  12. ShowTxtCommand = new RelayCommand<string>(ShowMsg);
  13. }
  14. /// <summary>
  15. /// 命令具体实现
  16. /// </summary>
  17. private void ShowMsg(string txt)
  18. {
  19. MessageBox.Show(txt);
  20. }

RelayCommand是否可执行

注意,这是一个非常有用的功能,当RelayCommand执行的条件不满足时,将会导致界面上的按钮是禁用的。条件的判断

是由WPF程序自动执行的,并且频率非常高,所以,判断是否可执行的代码应该尽量简单。

AppView.xaml

  1. <Grid>
  2. <TextBox x:Name="txt" Width="100" Height="30" Text="{Binding Txt,UpdateSourceTrigger=PropertyChanged}"></TextBox>
  3. <Button Width="100" Height="30" Command="{Binding ShowTxtCommand}" Margin="0,100,0,0"></Button>
  4. </Grid>

AppViewModel.cs

  1. private string _txt;
  2. /// <summary>
  3. /// 绑定到界面的Txt
  4. /// </summary>
  5. public string Txt
  6. {
  7. get
  8. {
  9. return _txt;
  10. }
  11. set
  12. {
  13. _txt = value;
  14. RaisePropertyChanged(() => Txt);
  15. }
  16. }
  17. /// <summary>
  18. /// 显示消息命令
  19. /// </summary>
  20. public RelayCommand ShowTxtCommand
  21. {
  22. get;
  23. set;
  24. }
  25. public AppViewModel()
  26. {
  27. //初始化命令
  28. ShowTxtCommand = new RelayCommand(ShowMsg, CanShowMsgExecute);
  29. }
  30. /// <summary>
  31. /// 命令具体实现
  32. /// </summary>
  33. private void ShowMsg()
  34. {
  35. MessageBox.Show(Txt);
  36. }
  37. /// <summary>
  38. /// 显示消息命令是否可以执行
  39. /// </summary>
  40. /// <returns></returns>
  41. private bool CanShowMsgExecute()
  42. {
  43. return !string.IsNullOrEmpty(Txt);
  44. }

注意:如果你使用的是.Net4.5,那么界面上的按钮可能禁用不到,这是Mvvm中的一个bug,不过作者已经修复了,解决

方案看这里.

RelayCommand的使用就是这么简单。

RelayCommand的更多相关文章

  1. RelayCommand命令

    原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...

  2. MVVM模式应用 之的RelayCommand的使用

    实现MVVM模式Command是立下了汗马功劳.当然ICommand要引用using System.Windows.Input命名空间. 比如: (1)我们在xaml页面有一个Button按钮,我们需 ...

  3. MVVM模式的3种command总结[2]--RelayCommand

    MVVM模式的3种command总结[2]--RelayCommand RelayCommand本来是WPF下面用的一种自定义的command,主要是它用到了事件管理函数,这个SL下面是没有的.不过这 ...

  4. C# II: Class ViewModelBase and RelayCommand in MVVM

    好久不写WPF和MVVM,新建一个Project后,想起来ViewModelBase和RelayCommand没有.以下Code摘自MSDN上的Article:Patterns - WPF Apps ...

  5. MVVMLight学习笔记(五)---RelayCommand深究

    一.概述 有时候,单纯的命令绑定不一定能满足我们的开发需求,比如我们需要在命令绑定的时候传递一个参数,这个时候,我们就需要使用RelayCommand的泛型版本了. RelayCommand的泛型版本 ...

  6. MVVMLight学习笔记(四)---RelayCommand初探

    一.概述 在MVVM Light框架中,主要通过命令绑定来进行事件的处理. WPF中,命令是通过实现 ICommand 接口创建的. ICommand 公开了两个方法(Execute 及 CanExe ...

  7. wpf 下面用MVVC的RelayCommand命令引发的一个异常

    具体解决方法参见我的博问:https://q.cnblogs.com/list/myquestion

  8. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...

  9. WinRT自定义控件第一 - 转盘按钮控件

    之前的文章中,介绍了用WPF做一个转盘按钮控件,后来需要把这个控件移植到WinRT时,遇到了很大的问题,主要原因在于WPF和WinRT还是有很大不同的.这篇文章介绍了这个移植过程,由于2次实现的控件功 ...

随机推荐

  1. IT软件开发常用英语词汇

    Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access ...

  2. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  3. SQLServer 数据修复命令DBCC一览

    1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL查询分析器中执行以下SQL进行数据库的修复,修复数据库存在的一致性错误与分配错误. use master decla ...

  4. iOS Build Active Architecture Only 属性的理解(及 not found for architecture i386 的解决方案)

    最近做项目过程遇到一个问题: 涉及到这个属性:Build Active Architecture Only Yes .No的区别: 设置为yes,是只编译当前的architecture版本,是为了编译 ...

  5. scalac error: bad option: '-make:transitive' on mvn package via command line

    1 问题描述: ubuntu环境下用eclipse+maven开发Scala的时候出现错误:scalac error: bad option: '-make:transitive' on mvn pa ...

  6. 调整busybox中syslogd读取内核printk信息长度

    busybox 默认读取内核printk信息长度256, 通过CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE宏可调整, 如下: #cd busybox-1.21.1#m ...

  7. Java【小考】

    课上, 老师出了一个题: 考察:1.类的定义 2.类的属性 3.类的方法.重载.构造方法.代码块 题目是这样的: 设计 一个 类:Tree 要求: 1.包含main方法 2.属性:静态: String ...

  8. [麦先生]TP3.2之微信开发那点事[基础篇](微信支付完成)

    两种模式:扫码支付和微信内支付(调用js-sdk) trade_type==native即扫码支付,只需要将code_url转成二维码,使用微信扫码即可: js-sdk微信内支付-调用微信js-sdk ...

  9. C++ 之 重载赋值操作符

    Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...

  10. BestCoder Round #87 1003 LCIS[序列DP]

    LCIS  Accepts: 109  Submissions: 775  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 65536/65 ...