我已经为自己编写了SingleExecutionCommand(我不确定该名称。可以随意提出另一个名称,但这不是我的问题),该名称不允许在第一次执行完成之前再次按下按钮。好吧,至少这是计划。
我想使用CommandManager处理我的CanExecuteChanged-Event,但是每当我更改ExecutionIsRunning -Flag时,我也需要自行触发此事件。

这是我的命令代码:

public class SingleExecutionCommand<T> : DelegateCommand<T>
{

    protected readonly Func<T, Task> AwaitableExecuteDelegate;

    public bool ExecutionIsRunning { get; protected set; }

    public SingleExecutionCommand(Func<T, Task> awaitableExecute, Predicate<T> canExecute = null) :
        base(null, canExecute)
    {
        AwaitableExecuteDelegate = awaitableExecute;
    }

    public SingleExecutionCommand(Action<T> execute, Predicate<T> canExecute = null)
        : base(execute, canExecute)
    {
        AwaitableExecuteDelegate = null;
    }

    public async override void Execute(object parameter)
    {
        if (parameter != null && !(parameter is T)) throw new ArgumentException("Command Parameter has the wrong type.");

        if (AwaitableExecuteDelegate == null)
        {
            ExecutionIsRunning = true;
            base.Execute(parameter);
            ExecutionIsRunning = false;
        }
        else
        {
            ExecutionIsRunning = true;
            await AwaitableExecuteDelegate((T)parameter);
            ExecutionIsRunning = false;
        }
    }

    public override bool CanExecute(object parameter)
    {
        return (!ExecutionIsRunning) && base.CanExecute(parameter);
    }
}


如果尝试在我的DelegateCommand<T>类中执行此操作:

protected void FireCanExcuteChangedEvent()
{
    if (CanExecuteChanged == null) return;

    CanExecuteChanged(this, EventArgs.Empty);
}


但这不起作用,因为该事件是重新路由的事件(到CommandManager.RequerySuggested),而不是真实的事件。那么,如何同时使用CommandManager和我自己的事件?

编辑:
CanExecuteChanged事件如下所示:

public event EventHandler CanExecuteChanged
{
    add
    {
        CommandManager.RequerySuggested += value;
    }
    remove
    {
        CommandManager.RequerySuggested -= value;
    }
}

最佳答案

由于处理程序已签名到CommandManager,因此我建议调用CommandManager.InvalidateRequerySuggested()
这将引发CanExecuteChanged事件,以表示有关命令有效性的条件已更改。现在,所有侦听器将重新评估是否可以通过响应CanExecute()调用来执行命令。如果结果为假,该命令将被禁用。

08-19 18:01