命令是什么?
微软的解释是一种输入机制,用于分隔语义和从执行命令的逻辑调用命令的对象,同时指示操作是否可用。参考命令概述。我的理解是在ViewModel中(不一定必须在ViewModel中),触发前端事件的机制。
Command的定义
WPF 中的命令是通过实现 ICommand 接口创建的。 ICommand 公开了两种方法 Execute 和 CanExecute,以及一个事件 CanExecuteChanged。 Execute 执行与该命令关联的操作。 CanExecute 确定是否可以在当前命令目标上执行该命令。 如果集中管理命令操作的命令管理器检测到命令源中存在一个可能使已引发命令无效但尚未由命令绑定执行的更改,则会引发 CanExecuteChanged。
public class SampleCommand<T> : ICommand
{
public event EventHandler CanExecuteChanged;
public Action<T> ExectionAction { get; set; }
public Func<T, bool> CanExecuteAction { get; set; }
public SampleCommand(Func<T, bool> isEx, Action<T> ex)
{
this.ExectionAction = ex;
this.CanExecuteAction = isEx;
}
public bool CanExecute(object parameter)
{
if (parameter is T)
{
return CanExecuteAction == null || CanExecuteAction((T)parameter);
}
return true;
}
public void Execute(object parameter)
{
if (parameter is T || parameter is null)
ExectionAction((T)parameter);
}
}
Command的使用
自带Command
像Button这种自带Command的,直接使用就行
<Button Command="{Binding ButtonClickCommand}" CommandParameter="1"/>
ViewModel中
public ICommand ButtonClickCommand { get; set; }
ButtonClickCommand = new SampleCommand(x => true, x =>
{
//TODO
});
事件Command
但是还是有很多本身是不带Command的,但还是要按照MVVM的方式,将事件与Command连接起来
先在nuget上安装Microsoft.Xaml.Behaviors.Wpf这个包
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:CallMethodAction MethodName="WindowLoaded" TargetObject="{Binding}" />
</i:EventTrigger>
<i:EventTrigger EventName="Closing">
<i:CallMethodAction MethodName="WindowClosing" TargetObject="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
ViewModel中
public void WindowLoaded(object obj, RoutedEventArgs arg)
{
//TODO
}
public void WindowClosing(object sender, CancelEventArgs obj)
{
//TODO
}