WPF绑定命令
一、目的
降低代码耦合度(降低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绑定命令的更多相关文章
- WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)
MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): <Wind ...
- WPF 在事件中绑定命令(不可以在模版中绑定命令)
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...
- WPF 在事件中绑定命令
导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...
- 整理:WPF中应用附加事件制作可以绑定命令的其他事件
原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...
- 整理:WPF用于绑定命令和触发路由事件的自定义控件写法
原文:整理:WPF用于绑定命令和触发路由事件的自定义控件写法 目的:自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分) 自定义控件增加IComman ...
- WPF之事件绑定命令
目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF C# 命令的运行机制
1.概述 1.1 WPF C# 命令的本质 命令是 WPF 中的输入机制,它提供的输入处理比设备输入具有更高的语义级别. 例如,在许多应用程序中都能找到的“复制”.“剪切”和“粘贴”操作就是命令. W ...
- WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...
随机推荐
- Nmap简介
nmap — 网络探测工具和安全/端口扫描器,参考<Nmap参考指南> 描述: Nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的 网络探测和安全审核的工具. ...
- Spring RestTemplate详解(转载)
转载来源:https://www.cnblogs.com/zhaoyan001/p/8442602.html 1.什么是REST? REST(RepresentationalState Transfe ...
- 【VS开发】修改窗口背景颜色大全
如何修改frame窗口的背景颜色? MDI窗口的客户区是由frame窗口拥有的另一个窗口覆盖的.为了改变frame窗口背景的颜色,只需要这个客户区的背景颜色就可以了.你必须自己处理WM_ERASEB ...
- Power Management of Hybrid DRAM/PRAM-Based Main Memory
0.ABSTRACT (1)non-volatile memory——low standby power DRAM——high performance and better active power ...
- (模板)luoguP3806(树上点分治模板题)
点分治的写法1: 题目链接:https://www.luogu.org/problem/P3806 题意:给出一颗带边权的树,结点数n<=1e4,每条边有权值<=1e4,有m组询问(m&l ...
- PAT(Advanced Level)1055.The World's Richest
Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...
- PAT B1002 写出这个数(20)
AC代码 #include <cstdio> #include <iostream> #include <cstring> using namespace std; ...
- UAV图像拼接软件编译环境配置
1,需要下载的软件: 依次安装qt-opensource.addin qt安装目录为C:\Qt\4.8.6 2,vs2010配置 *配置UAVBeta工程的属性,下图黑色字体部分与qt相关,取决于你的 ...
- Docker——桥接网络配置
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# ls ifcfg-et ...
- 并不对劲的复健训练-p5212 SubString
题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...