WPF自定义Command

28 篇文章 3 订阅

命令是什么?

微软的解释是一种输入机制,用于分隔语义和从执行命令的逻辑调用命令的对象,同时指示操作是否可用。参考命令概述。我的理解是在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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值