Итак, у меня есть кнопка, связанная с командой входа в систему
private ICommand loginCommand;
public ICommand LoginCommand
{
get
{
if (loginCommand == null)
{
loginCommand = new Command(login, CanExecuteCommand);
}
return loginCommand;
}
}
Действие CanExecuteCommand
возвращает !IsBusy
В действии login () я начинаю с IsBusy = true
и заканчивается IsBusy = false;
В установщике IsBusy
я также вызываю метод ChangeCanExecute()
, например, такой:
((Command)comm).ChangeCanExecute();
Когда я отлаживаю, ChangeCanExecute
действительно вызывается в экземпляре команды в начале и в конце метода. Однако, если я дважды нажму кнопку, она все равно вызовет команду дважды. Это почему? Какой самый чистый способ отключить двойной щелчок с помощью MVVM ... Кстати, на другой виртуальной машине я использую тот же подход, и он работает совершенно нормально, но там в выполняемой команде я вызываю метод asyn c, поэтому я использую await
, Может поэтому там работает? В случае login
я вызываю метод void
в команде, поэтому, если я дважды нажму на кнопку, вызовы просто попадут в очередь? Я до сих пор не понимаю, почему ChangeCanExecute+IsBusy
недостаточно.
PS Хотя мои команды определены в ВМ, IsBusy, CanExecuteCommand
и повышение события ChangeCanExecute
происходят в BaseViewModel
.
Редактировать 1: В login()
у меня есть такой код: { IsBusy = true; DoSomething(); IsBusy = false;}
Это имеет неожиданную функциональность, которую я объяснил, и он вызывается дважды. Однако, если я изменю это, чтобы быть в Задаче, как у меня в моей рабочей виртуальной машине, двойное нажатие не возможно, какие-либо подсказки?
IsBusy = true;
Task.Run(() =>
{
DoSomething();
}).SafeFireAndForget();
IsBusy = false;
Я просмотрел ответы на этот вопрос, и они, кажется, не используют подход MVVM, и они предлагают решения, использующие TapGestureRecognizer
/ некоторые другие вещи, которые не кажутся лучшими практиками MVVM.