Я использую Josh Smith's implementation of RelayCommand в нескольких крупных проектах уже несколько лет. Однако сегодня я столкнулся с сценарием, когда CanExecute по одной из моих команд не освежает. Я в недоумении относительно того, что вызывает это - модель представления не делает ничего, что я уже не делал уже десятки раз.В каких сценариях ICommand CanExecute не обновляется?
Конструктор VM создает пару команд. Первый из них является команда "Пуск": -
StartCommand = new RelayCommand(o => StartAsync(), o => true);
метод StartAsync() выглядит следующим образом: -
private async void StartAsync()
{
IsRunning = true;
await Task.Run(() => SomeLongRunningProcess(); }
IsRunning = false;
}
Существует также команда "сохранить": -
SaveCommand = new RelayCommand(o => Save(), o => !IsRunning);
('IsRunning' - это свойство bog-standard, реализующее INotifyPropertyChanged. Также, как и для делегата CanExecute, он также привязан к свойству IsEnabled нескольких элементов управления в представлении, чтобы включить/отключить их).
Когда я нажимаю кнопку «Пуск» (привязана к «StartCommand»), кнопка «Сохранить» правильно отключена. Процесс b/g завершается, тогда значение IsRunning установлено на false, но это не приводит к включению кнопки «Сохранить». Он позволяет только щелкнуть где-нибудь на моем представлении.
(Элементы управления которых IsEnabled
свойство связано со свойством В. М. IsRunning
сделать включать и выключать правильно, кстати).
Я натолкнулся на несколько статей SO об этом, но ничего не объясняет , почему это происходит. Моим обходным путем было привязать свойство кнопки IsEnabled
к «IsRunning», но это разочаровывает, что этот конкретный вид отказался играть в мяч. Любые мысли о том, что может быть причиной этого? Здравый смысл говорит, что это что-то особенное для этого взгляда/VM, но я в тупик (и я не буду публиковать код здесь - слишком много).
Является 'SomeLongRunningProcess()' фоновый поток или поток, кроме потока пользовательского интерфейса? Может ли это быть проблемой сквозного доступа к компонентам пользовательского интерфейса? – CodingGorilla
Ваши команды могут реализовать событие CanExecuteChanged. Вы пробовали это? – XAMlMAX
@CodingGorilla Это поток b/g, однако, когда он заканчивается в ожидании, в потоке пользовательского интерфейса происходит «IsRunning = false». Я использовал ту же технику в командах на других видах/виртуальных машинах без проблем. –