Я пишу приложение WPF с помощью шаблона MVVM, на основе следующей статьи: Приложения WPF С Шаблоном разработки Model-View-ViewModel
У меня есть две кнопки на моем Представлении со связанным свойством "Command" кнопок (с привязкой данных) к приведенному примеру класса RelayCommand (см. "рисунок 3 Класс RelayCommand" от статьи выше). Класс RelayCommand имеет поддержку проверки, может ли данная команда быть выполнена.
WPF автоматически отключает кнопки, команда которых не может быть выполнена.
Каждая из моих команд (в классе ViewModel) запускает фоновую работу, и команда не может быть выполнена снова, пока фоновая работа не закончена. Экземпляры RelayCommand имеют информацию, работает ли фоновая работа все еще, или она закончена.
Моя проблема следующая: после нажатия любой из кнопок кнопки автоматически идут отключенные (который в порядке), потому что запущенная фоновая работа и команда не может быть выполнена, пока это не закончено, но после того, как операция закончилась, кнопки не идут, включил автоматически, потому что их команда "может быть выполнена" предикат, автоматически не переоценен. Переоценка может быть вручную инициирована при наличии приложения, освобождают и возвращают фокус (путем нажатия ALT+TAB). После выполнения этого приема кнопки включены еще раз.
То, как я могу программно переоценить команду кнопок, "может выполнить" состояние?
Вы можете вызвать InvalidateRequerySuggested в CommandManager, чтобы уведомить о необходимости повторного запроса CanExecute:
CommandManager.InvalidateRequerySuggested();
Это действительно зависит от того, правильно ли реализована конкретная реализация ICommand шаблон ICommand.CanExecuteChanged, поэтому YMMV.
Обновление
Например, я использую Prism, у которого есть собственная базовая реализация ICommand: DelegateCommand. Я считаю, что вызов RaiseCanExecuteChanged () в DelegateCommand в Prism работает для меня.
Обновление 2
Убедитесь, что вы вызываете InvalidateRequerySuggested () в потоке пользовательского интерфейса. При необходимости воспользуйтесь Диспетчером, чтобы позвонить.