我已经为自己编写了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()
调用来执行命令。如果结果为假,该命令将被禁用。