【发布时间】:2022-03-10 07:35:35
【问题描述】:
我给自己写了一个 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>-Class 中尝试这样做:
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;
}
}
【问题讨论】:
标签: c# wpf asynchronous c#-5.0 commandbinding