Мое приложение написано с использованием шаблона MVVM в WPF, и все мои кнопки используют привязки команд для выполнения кода в моей модели. Все команды имеют код в CanExecute для определения состояния «Включено» связанной кнопки. Логика работает отлично, но во всех случаях GUI остается в отключенном состоянии, если я не щелкну где-нибудь еще в GUI.
Например, у меня есть кнопка Discard Candy. Когда я нажимаю эту кнопку, он запускает процесс в потоке потоков, который устанавливает для свойства bool с именем Running значение true . Так как метод CanExecute для команды Discard Candy выглядит примерно так
public bool CanExecute(object parameter)
{
return !Running;
}
кнопка будет отключена после запуска процесса. Проблема заключается в том, что когда процесс завершен, для параметра Running установлено значение false , но графический интерфейс не обновляется, т. Е. Discard Candy не включается повторно.
Однако, если я нажимаю в любом месте графического интерфейса, например в окне или строке заголовка, кнопка Discard Candy внезапно становится активной. Так что логика работает, но происходит что-то, чего я просто не понимаю. Может кто-нибудь объяснить мне это поведение?
РЕДАКТИРОВАТЬ - до сих пор это звучит как CommandManager. InvalidateRequerySuggested не помог людям. Я собираюсь дать ему шанс, но на данный момент я немного осторожен с этим. Я перешел по рекомендованным ссылкам и решил прочитать больше о легком инструментарии MVVM. Звучит очень хорошо - кто-нибудь здесь использовал это и смог подтвердить, что это не показывает проблему, с которой я сталкивался до сих пор? Хотя я планирую попробовать легкий инструментарий MVVM в следующем крупном выпуске. моего приложения я не хочу возвращать все команды, которые у меня есть на данный момент, поэтому, скорее всего, я начну с CommandManager.InvalidateRequerySuggested, чтобы мы могли получить еще одну точку данных относительно ее полезности.
EDIT # 2 - очень интересно, легкий инструментарий MVVM на самом деле полагается на CommandManager.InvalidateRequerySuggested для поддержки способности пользовательского интерфейса отключать / повторно включать команды. Автор говорит:
"Строго говоря, в WPF, и если ваша команда связана с элементом управления, который отслеживается CommandManager, вам не нужно вызывать событие CanExecuteChanged самостоятельно. Вы можете позволить CommandManager справиться с ситуацией. внешние события также могут изменить состояние пользовательского интерфейса. Давайте представим, что пользовательский интерфейс должен быть включен с 9:00 до 17:00, а затем отключен на ночь. Пользователь не запускает пользовательский интерфейс, поэтому код должен (вежливо) запросить CommandManager запрашивает состояние команд. Это делается путем вызова метода InvalidateRequerySuggested в CommandManager. И, как вы уже догадались, метод RaiseCanExecuteChanged класса RelayCommand делает именно это."