RelayCommand
RelayCommand
Mvvm最大的特点就是分离了View和ViewModel,将数据的显示和业务逻辑分开。使用WPF的Binding,我们不仅能够
将数据从ViewModel绑定到View,同时也可以将行为绑定到View。例如,在主界面上点击一个按钮,这个按钮实际完成
的操作是ViewModel中对应的方法。这里我们用到Mvvm框架中的RelayCommand。下面是几种常用的情况
不带参数的RelayCommand
点击按钮,弹出消息框
AppView.xaml
<Grid>
<Button Width="100" Height="30" Command="{Binding ShowMsgCommand}"></Button>
</Grid>
AppViewModel.cs
/// <summary>
/// 显示消息命令
/// </summary>
public RelayCommand ShowMsgCommand
{
get;
set;
}
public AppViewModel()
{
//初始化命令
ShowMsgCommand= new RelayCommand(ShowMsg);
}
/// <summary>
/// 命令具体实现
/// </summary>
private void ShowMsg()
{
MessageBox.Show("HelloWorld!");
}
带参数的RelayCommand
点击按钮,显示我们输入的文本
AppView.xaml
<Grid>
<TextBox x:Name="txt" Width="100" Height="30"></TextBox>
<Button Width="100" Height="30" Command="{Binding ShowTxtCommand}" CommandParameter="{Binding ElementName=txt,Path=Text}" Margin="0,100,0,0"></Button>
</Grid>
AppViewModel.cs
/// <summary>
/// 显示消息命令
/// </summary>
public RelayCommand<string> ShowTxtCommand
{
get;
set;
}
public AppViewModel()
{
//初始化命令
ShowTxtCommand = new RelayCommand<string>(ShowMsg);
}
/// <summary>
/// 命令具体实现
/// </summary>
private void ShowMsg(string txt)
{
MessageBox.Show(txt);
}
RelayCommand是否可执行
注意,这是一个非常有用的功能,当RelayCommand执行的条件不满足时,将会导致界面上的按钮是禁用的。条件的判断
是由WPF程序自动执行的,并且频率非常高,所以,判断是否可执行的代码应该尽量简单。
AppView.xaml
<Grid>
<TextBox x:Name="txt" Width="100" Height="30" Text="{Binding Txt,UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Button Width="100" Height="30" Command="{Binding ShowTxtCommand}" Margin="0,100,0,0"></Button>
</Grid>
AppViewModel.cs
private string _txt;
/// <summary>
/// 绑定到界面的Txt
/// </summary>
public string Txt
{
get
{
return _txt;
}
set
{
_txt = value;
RaisePropertyChanged(() => Txt);
}
}
/// <summary>
/// 显示消息命令
/// </summary>
public RelayCommand ShowTxtCommand
{
get;
set;
}
public AppViewModel()
{
//初始化命令
ShowTxtCommand = new RelayCommand(ShowMsg, CanShowMsgExecute);
}
/// <summary>
/// 命令具体实现
/// </summary>
private void ShowMsg()
{
MessageBox.Show(Txt);
}
/// <summary>
/// 显示消息命令是否可以执行
/// </summary>
/// <returns></returns>
private bool CanShowMsgExecute()
{
return !string.IsNullOrEmpty(Txt);
}
注意:如果你使用的是.Net4.5,那么界面上的按钮可能禁用不到,这是Mvvm中的一个bug,不过作者已经修复了,解决
方案看这里.
RelayCommand的使用就是这么简单。
RelayCommand的更多相关文章
- RelayCommand命令
原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...
- MVVM模式应用 之的RelayCommand的使用
实现MVVM模式Command是立下了汗马功劳.当然ICommand要引用using System.Windows.Input命名空间. 比如: (1)我们在xaml页面有一个Button按钮,我们需 ...
- MVVM模式的3种command总结[2]--RelayCommand
MVVM模式的3种command总结[2]--RelayCommand RelayCommand本来是WPF下面用的一种自定义的command,主要是它用到了事件管理函数,这个SL下面是没有的.不过这 ...
- C# II: Class ViewModelBase and RelayCommand in MVVM
好久不写WPF和MVVM,新建一个Project后,想起来ViewModelBase和RelayCommand没有.以下Code摘自MSDN上的Article:Patterns - WPF Apps ...
- MVVMLight学习笔记(五)---RelayCommand深究
一.概述 有时候,单纯的命令绑定不一定能满足我们的开发需求,比如我们需要在命令绑定的时候传递一个参数,这个时候,我们就需要使用RelayCommand的泛型版本了. RelayCommand的泛型版本 ...
- MVVMLight学习笔记(四)---RelayCommand初探
一.概述 在MVVM Light框架中,主要通过命令绑定来进行事件的处理. WPF中,命令是通过实现 ICommand 接口创建的. ICommand 公开了两个方法(Execute 及 CanExe ...
- wpf 下面用MVVC的RelayCommand命令引发的一个异常
具体解决方法参见我的博问:https://q.cnblogs.com/list/myquestion
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...
- WinRT自定义控件第一 - 转盘按钮控件
之前的文章中,介绍了用WPF做一个转盘按钮控件,后来需要把这个控件移植到WinRT时,遇到了很大的问题,主要原因在于WPF和WinRT还是有很大不同的.这篇文章介绍了这个移植过程,由于2次实现的控件功 ...
随机推荐
- IT软件开发常用英语词汇
Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access ...
- SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...
- SQLServer 数据修复命令DBCC一览
1. DBCC CHECKDB 重启服务器后,在没有进行任何操作的情况下,在SQL查询分析器中执行以下SQL进行数据库的修复,修复数据库存在的一致性错误与分配错误. use master decla ...
- iOS Build Active Architecture Only 属性的理解(及 not found for architecture i386 的解决方案)
最近做项目过程遇到一个问题: 涉及到这个属性:Build Active Architecture Only Yes .No的区别: 设置为yes,是只编译当前的architecture版本,是为了编译 ...
- 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 ...
- 调整busybox中syslogd读取内核printk信息长度
busybox 默认读取内核printk信息长度256, 通过CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE宏可调整, 如下: #cd busybox-1.21.1#m ...
- Java【小考】
课上, 老师出了一个题: 考察:1.类的定义 2.类的属性 3.类的方法.重载.构造方法.代码块 题目是这样的: 设计 一个 类:Tree 要求: 1.包含main方法 2.属性:静态: String ...
- [麦先生]TP3.2之微信开发那点事[基础篇](微信支付完成)
两种模式:扫码支付和微信内支付(调用js-sdk) trade_type==native即扫码支付,只需要将code_url转成二维码,使用微信扫码即可: js-sdk微信内支付-调用微信js-sdk ...
- C++ 之 重载赋值操作符
Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...
- BestCoder Round #87 1003 LCIS[序列DP]
LCIS Accepts: 109 Submissions: 775 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65 ...