Переоценка Programatic команды MVVM “может выполнить” состояние

Я пишу приложение WPF с помощью шаблона MVVM, на основе следующей статьи: Приложения WPF С Шаблоном разработки Model-View-ViewModel

У меня есть две кнопки на моем Представлении со связанным свойством "Command" кнопок (с привязкой данных) к приведенному примеру класса RelayCommand (см. "рисунок 3 Класс RelayCommand" от статьи выше). Класс RelayCommand имеет поддержку проверки, может ли данная команда быть выполнена.

WPF автоматически отключает кнопки, команда которых не может быть выполнена.

Каждая из моих команд (в классе ViewModel) запускает фоновую работу, и команда не может быть выполнена снова, пока фоновая работа не закончена. Экземпляры RelayCommand имеют информацию, работает ли фоновая работа все еще, или она закончена.

Моя проблема следующая: после нажатия любой из кнопок кнопки автоматически идут отключенные (который в порядке), потому что запущенная фоновая работа и команда не может быть выполнена, пока это не закончено, но после того, как операция закончилась, кнопки не идут, включил автоматически, потому что их команда "может быть выполнена" предикат, автоматически не переоценен. Переоценка может быть вручную инициирована при наличии приложения, освобождают и возвращают фокус (путем нажатия ALT+TAB). После выполнения этого приема кнопки включены еще раз.

То, как я могу программно переоценить команду кнопок, "может выполнить" состояние?

10
задан Animesh 30 November 2011 в 19:38
поделиться

1 ответ

Вы можете вызвать InvalidateRequerySuggested в CommandManager, чтобы уведомить о необходимости повторного запроса CanExecute:

CommandManager.InvalidateRequerySuggested();

http://msdn.microsoft.com/en-us/library/system.windows. input.commandmanager.invalidaterequerysuggested.aspx

Это действительно зависит от того, правильно ли реализована конкретная реализация ICommand шаблон ICommand.CanExecuteChanged, поэтому YMMV.

Обновление

Например, я использую Prism, у которого есть собственная базовая реализация ICommand: DelegateCommand. Я считаю, что вызов RaiseCanExecuteChanged () в DelegateCommand в Prism работает для меня.

Обновление 2

Убедитесь, что вы вызываете InvalidateRequerySuggested () в потоке пользовательского интерфейса. При необходимости воспользуйтесь Диспетчером, чтобы позвонить.

20
ответ дан 3 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: