Я использую Xamarin и MVVMCross, хотя это не WPF. Я думаю, что применимо следующее решение, я создал решение, специфичное для viewmodel (не связанное с пользовательским интерфейсом для конкретной платформы), которое я считаю очень удобным, используя помощника. или базовый класс для модели представления создает список, который отслеживает команды, что-то вроде этого:
private readonly List<string> Commands = new List<string>();
public bool IsCommandRunning(string command)
{
return Commands.Any(c => c == command);
}
public void StartCommand(string command)
{
if (!Commands.Any(c => c == command)) Commands.Add(command);
}
public void FinishCommand(string command)
{
if (Commands.Any(c => c == command)) Commands.Remove(command);
}
public void RemoveAllCommands()
{
Commands.Clear();
}
Добавьте команду в действие следующим образом:
public IMvxCommand MyCommand
{
get
{
return new MvxCommand(async() =>
{
var command = nameof(MyCommand);
if (IsCommandRunning(command)) return;
try
{
StartCommand(command);
await Task.Delay(3000);
//click the button several times while delay
}
finally
{
FinishCommand(command);
}
});
}
}
Команда try / finally просто гарантирует, что команда всегда завершается.
Протестировал это, установив асинхронное действие и сделав задержку, первое нажатие срабатывает, второе возвращается в состояние.