MVVM的目的是为了最大限度地降低了Xaml文件和CS文件的耦合度,分离界面和业务逻辑,所以我们要尽可能的在View后台不写代码。但是这个例子中,我们将更新ViewModel的代码写在了View里。我们能否把按钮的响应处理代码也不写在后台代码里呢?
WPF引入Command(命令),通过为Button设置Command来做响应。
命令:Command是一种不同于输入设备的语义级别上的输入处理机制。 Command的目的:
1)降低代码耦合度,将Command的逻辑和调用对象进行分离;
2)可以指定对象是否可用;
Command允许多个不同的对象可以调用同一个命令,也可以为不同的对象定义特殊的逻辑;
命令分类:
1.预定义的命令(predefined command)
1)ApplicationCommands 提供一组与应用程序相关的标准命令(可以直接使用)
2)ComponentCommands 提供一组标准的与组件相关的命令
3)NavigationCommands 提供一组标准的与导航相关的命令。
还有很多诸如:MediaCommands,EditiingCommands
2.自定义Command
(1)Command:要执行的操作。
所有的命令需要继承自接口ICommand。
Execute:执行与命令关联的操作。
CanExecute:决定对于当前目标command能否被执行。
CanExecuteChanged(事件): 当出现影响是否应执行该命令的更改时发生。
(2)CommandSource:表示调用命令的对象.
所有command source需要继承ICommandSource。
ICommandSource:定义一个知道如何调用命令的对象。
Command:执行的命令
CommandParameter: 命令特定数据(传递给该命令的用户定义的数据值)
CommandTarget:在其上执行该命令的对象(目标对象)
(3) command target:表示执行命令的对象
(4) command binding:建立源和目标的关系,映射命令和命令逻辑,
有时候CommandBinding由控件提供,但command binding并不总是依赖于控件,也可以是自定义的。
RoutedCommand:
在WPF中使用命令的步骤:
1.创建命令 2.绑定命令 3.设置命令源 4.设置命令目标
WPF中命令的核心是System.Windows.Input.ICommand接口,所有命令对象都实现了此接口。当创建自己的命令时,不能直接实现ICommand接口,而是要使用System.Windows.Input.RouteCommand类,该类已经实现了ICommand接口,所有WPF命令都是RouteCommand类的实例。在程序中处理的大部分命令不是RoutedCommand对象,而是RoutedUICommand类的实例,它继承自RouteCommand类。
RoutedCommand: 实现ICommand并在元素树之内进行路由的命令
RoutedUICommand: 定义一个在元素树中路由并包含一个文本属性的ICommand
RoutedUICommand--->RouteCommand-->ICommand
定义命令:<window.Resources>
建立事件处理函数:后台逻辑
绑定:<window.CommandBindings>
引用:(XMAL) Command="{staticResources .....}"
但还是不常用,麻烦