一、目的

降低代码耦合度(降低UI层和BLL层的代码耦合度),将UI层的后台代码更好的转移到BLL层中,让视图和业务逻辑分离的更好

二、使用方式

1.创建一个RelayCommand,继承ICommand接口

    public class RelayCommand : ICommand
{
#region Fields
private readonly Func<Object, Boolean> _canExecute;
private readonly Action<Object> _execute;
#endregion #region Constructors
public RelayCommand(Action<Object> execute) : this(execute, null)
{
} public RelayCommand(Action<Object> execute, Func<Object, Boolean> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute"); _execute = execute;
_canExecute = canExecute;
}
#endregion #region ICommand Members
public event EventHandler CanExecuteChanged
{
add
{
if (_canExecute != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (_canExecute != null)
CommandManager.RequerySuggested -= value;
}
} public Boolean CanExecute(Object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
} public void Execute(Object parameter)
{
_execute(parameter);
}
#endregion
}

2.创建一个ViewModel类,创建RelayCommand属性对象

(1)使用lambda表达式

public class ViewModelTest
{
public ICommand ShowMessage
{
get
{
return new RelayCommand(new Action<Object>(t =>
{
if (t == null)
MessageBox.Show("not have param");
else
MessageBox.Show(t.ToString());
}));
}
}
}

(2)使用函数

    public class ViewModelTest
{ private void UpdateNameExecute(Object parameter)
{
MessageBox.Show("haha");
} private bool CanUpdateNameExecute(Object parameter)
{
return true;
} public ICommand ShowMessage
{
get
{
return new RelayCommand(UpdateNameExecute, CanUpdateNameExecute);
}
}
}

3.界面后台类,将ViewModel对象赋给内容上下文

 DataContext = new ViewModelTest();

4.界面绑定命名

(1)不带参数

<Button Width="" Height="" Command="{Binding ShowMessage}"/>

(2)带参数

 <Button Width="" Height="" Command="{Binding ShowMessage}" CommandParameter="have param"/>

5.绑定命令的方式

(1) button类型的按钮 直接用Command绑定

<Button Width="60" Height="30" Command="{Binding ShowMessage}"/>

(2) InputBindings.MouseBinding 鼠标事件绑定

例:

        <Label Content="点击我呀"  HorizontalAlignment="Left" Height="23" Margin="243,256,0,0" VerticalAlignment="Top" Width="120">
<Label.InputBindings>
<MouseBinding MouseAction="LeftClick" Command="{Binding CmdShow}"></MouseBinding>
</Label.InputBindings>
</Label>

MouseAction:

// 不执行任何操作。
None = 0,
// 单击鼠标左键。
LeftClick = 1,
// 单击鼠标右键。
RightClick = 2,
// 单击鼠标按钮。
MiddleClick = 3,
// 单次鼠标轮旋转。
WheelClick = 4,
// 双击鼠标左键。
LeftDoubleClick = 5,
// 双击鼠标右键。
RightDoubleClick = 6,
// 双击鼠标按钮。
MiddleDoubleClick = 7

(3)InputBindings.KeyBinding 键盘事件绑定

<Window.InputBindings>
//按键A
<KeyBinding Key="A" Command="{Binding CmdShow}"/>
//按键Ctrl + B
<KeyBinding Gesture="Ctrl + B" Command="{Binding CmdShow}"/>
//按键Shift+C
<KeyBinding Modifiers="Shift" Key="C" Command="{Binding CmdShow}"/>
</Window.InputBindings>

key(enum Key):单个按键

Gesture:组合按键

Modeifers(enum ModifierKeys):指定修改键集 和key组合使用

public enum ModifierKeys
{
// 按下没有任何修饰符。
None = 0,
// ALT 键。
Alt = 1,
// CTRL 键。
Control = 2,
// SHIFT 键。
Shift = 4,
// Windows 徽标键。
Windows = 8
}

参考:

https://www.cnblogs.com/weiweiboqi/p/4682136.html

WPF绑定命令的更多相关文章

  1. WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)

    MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): <Wind ...

  2. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

  3. WPF 在事件中绑定命令

    导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...

  4. 整理:WPF中应用附加事件制作可以绑定命令的其他事件

    原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...

  5. 整理:WPF用于绑定命令和触发路由事件的自定义控件写法

    原文:整理:WPF用于绑定命令和触发路由事件的自定义控件写法 目的:自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分) 自定义控件增加IComman ...

  6. WPF之事件绑定命令

    目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...

  7. WPF快速入门系列(4)——深入解析WPF绑定

    一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...

  8. WPF C# 命令的运行机制

    1.概述 1.1 WPF C# 命令的本质 命令是 WPF 中的输入机制,它提供的输入处理比设备输入具有更高的语义级别. 例如,在许多应用程序中都能找到的“复制”.“剪切”和“粘贴”操作就是命令. W ...

  9. WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因

    原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...

随机推荐

  1. [Nowcoder212D]禁书目录_概率期望

    禁书目录 题目大意:清教需要定期给Index清除记忆,在此之前需要把当中的十万三千本禁书取出来......不幸的是,禁书一旦离开了Index就非常脆弱,具体来说,每一本禁书都有一个魔力值 ai ,其记 ...

  2. 外边距margin的叠加问题

    下午在看<css禅意花园>,书中提到了外边距重叠,于是去网上搜索了一下资料. 写了一个小例子做测试.发现网上的有些总结与我的测试不符,索性就自己总结了╮(╯▽╰)╭ <!DOCTYP ...

  3. 阿里云云计算ACP专业认证考试

    阿里云云计算专业认证(Alibaba Cloud Certified Professional,ACP)是面向使用阿里云云计算产品的架构.开发.运维类人员的专业技术认证. 更多阿里云云计算ACP专业认 ...

  4. MySQL+navicat-1064 Error解决方案

    MySQL+navicat-1064 Error解决方案 错误 #1064 - You have an error in your SQL syntax; check the manual that ...

  5. 链表操作Java实现

    单链表 存储结构 public class ListNode { int i; ListNode next; ListNode(int i) { this.i = i; } public String ...

  6. drf-更新四大接口-单改整体-单改局部-群改整体-群改局部-04

    目录 复习 基于前一天序列化基础 整体单改 单与整体局部修改 复习 """ 1.ModelSerializer序列化类 models.py class BaseModel ...

  7. Python学习8——魔法方法、特性和迭代器

    Python中很多名称比较古怪,开头和结尾都是两个下划线.这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称.这样的名称中大部分都是魔法(方法)的名称.如果你的对象实现了这些方法,他们将在 ...

  8. 本地代码库,提交远程git

    1.在git上新建项目,并填好相关信息 2.新建成功后,复制项目地址 3.idea新建本地仓库 4.Add所有文件,然后提交(commit) 5.先打开push界面,设置git远程地址,然后关掉,先p ...

  9. Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机

    甲方爸爸要求,用Linux压测......   所以在公司服务器Linux上搭建Jmeter 但实际一个Jmeter程序也有程序瓶颈~ 所以在Jmeter瓶颈下,搭建分布式压测系统.(也许可以尝试在一 ...

  10. Web开发Flask框架学习笔记

    Python 是一种跨平台的[计算机程序设计语言],是一种面向对象的动态类型语言,Python是纯粹的自由软件,源代码和解释器CPython遵循 GPL(GNU General Public Lice ...