Как я могу поднять CanExecuteChanged () программно? - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужно программно повысить CanExecuteChanged().Класс ICommand выглядит следующим образом:

public class PlayCommand : ICommand
{
    private readonly TpViewModel _tpViewModel;
    private bool IsBusy;

    public PlayCommand(TpViewModel tpViewModel)
    {
        _tpViewModel = tpViewModel;
    }

    public bool CanExecute(object parameter)
    {
        return !IsBusy;
    }

    public async void Execute(object parameter)
    {
        if (IsBusy)
            return;

        await Play();
    }

    public event EventHandler CanExecuteChanged
    {
        add => CommandManager.RequerySuggested += value;
        remove => CommandManager.RequerySuggested -= value;
    }

    private async Task Play()
    {
        IsBusy = true;

        Console.WriteLine("Play")

        IsBusy = false;
    }
}

Кнопка Play должна быть активирована, как только метод Play() будет завершен.Тем не менее, кажется, что задержка секунды или две, прежде чем кнопка будет включена.

Я пробовал CommandManager.InvalidateRequerySuggested(), но это не работает.

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете использовать CommandManager.InvalidateRequerySuggested(), хотя это довольно дорого.Однако вы можете просто расширить свой класс стандартными шаблонами событий.

Примечание : это только пример, основанный на вашем коде и не предназначенный для того, чтобы быть лучшим в мире.реализация класса ICommand, измените его по мере необходимости

private EventHandler _canExecuteChanged;

public event EventHandler CanExecuteChanged
{
   add
   {
      _canExecuteChanged += value;
      CommandManager.RequerySuggested += value;
   }
   remove
   {
      _canExecuteChanged -= value;
      CommandManager.RequerySuggested -= value;
   }
}

public void RaiseCanExecuteChanged()
{
   if (!IsBusy)
      OnCanExecuteChanged();
}

protected virtual void OnCanExecuteChanged()
   => _canExecuteChanged?.Invoke(this, EventArgs.Empty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...