Двойной щелчок Xamarin MVVM выполняет команду дважды, а IsBusy не работает - PullRequest
1 голос
/ 31 марта 2020

Итак, у меня есть кнопка, связанная с командой входа в систему

    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.

1 Ответ

1 голос
/ 02 апреля 2020

По моему мнению, то, что вы описали, является нормальным поведением, основанным на коде, который вы используете. Я думаю, будет ли команда вызываться дважды, в зависимости от продолжительности между вашими событиями двух нажатий.

Например, скажем, вашему DoSomething(); требуется 2 секунды (просто пример) до конца sh. Тогда, если продолжительность между вашими двумя событиями щелчка менее 2 секунд, команда будет выполнена только один раз, и вы этого хотите. Если продолжительность больше 2 секунд, команда будет вызвана дважды.

Это то же самое, даже если вы сделаете метод asyn c и ждете его.

Если вы хотите предотвратить двойной щелчок в течение определенного периода времени, вы можете просто добавить await Task.Delay(1000); после DoSomething();, чтобы предотвратить двойной щелчок в одну секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...