ICommand.CanExecute async - PullRequest
       6

ICommand.CanExecute async

2 голосов
/ 16 ноября 2011

У меня есть команда, проверка которой для CanExecute занимает много времени. Теперь я спрашиваю, можно ли запустить метод CanExecute асинхронным?

Ответы [ 4 ]

6 голосов
/ 16 ноября 2011

Ну, это возможно.Вы должны использовать CanExecutedChanged.Выполните длительную проверку в фоновом режиме (вы можете использовать BackgroundWorker ), сохраните результат, если вы можете выполнить его, или нет, запустите событие и просто верните кэшированное значение в ваш CanExecute.

4 голосов
/ 16 ноября 2011

Нет, вы не можете напрямую запускать его асинхронно.Вы также не должны знать, когда подсистема привязки будет вызывать ее.

Ничто не мешает вам запустить фоновый поток из этой функции, но, честно говоря, это не имеет большого смысла.Если ваш код CanExecute занимает слишком много времени на выполнение, вам действительно нужно переоценить то, что вы делаете, означает ли это повтор кода или повторный пользовательский интерфейс, чтобы удалить зависимость от CanExecute.используйте DelegateCommand из Prism , вы можете принудительно заставить все, что связано с командой, переоценить CanExecute при выборе.Это можно сделать, вызвав для команды функцию RaiseCanExecuteChanged () .Если затем у вас работает фоновый поток, который вызывает его при необходимости, он должен функционировать так, как вам нужно.

1 голос
/ 16 ноября 2011

CanExecute должен работать в потоке GUI.

Но вы можете просто реализовать это для себя:

Используйте логическое свойство, которое обновляется из потока. Когда это установлено, также вызовите NotifyPropertyChanged (для Команды).

Вероятно, по умолчанию это свойство имеет значение false, но это зависит от логики вашего домена.

0 голосов
/ 16 ноября 2011

в реализациях ICommand проверка CanExecute является чисто необязательной , единственным реальным преимуществом использования CanExecute является то, что некоторые элементы управления пользовательского интерфейса, связанные с командой, могут прослушивать событие CanExecuteChanged и сами включать / отключать. Есть много способов достичь этого.

Вам не нужно использовать CanExecute только для того, чтобы следовать соглашениям. Почему вы не можете запустить долгую проверку на разрушение в отдельном потоке, чтобы избежать зависания пользовательского интерфейса и выполнить операцию в конце?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...