Как или когда очищать объекты RelayCommand в WPF / MVVM? - PullRequest
2 голосов
/ 24 августа 2011

Я использую стандартную реализацию RelayCommand Джоша Смита для реализации ICommands в моем приложении WPF / MVVM. См .: Приложения WPF с шаблоном проектирования MVVM

Некоторые из моих методов CanExecute занимают много времени. По отдельности они не плохие (доли секунды каждый). Но я заметил, что чем больше команд я привязываю к своему пользовательскому интерфейсу, тем медленнее реагирует приложение (задержки превышают 10 секунд - чёрт).

Я полагаю, это потому, что RelayCommand CanExecuteChanged подключается к событию CommandManager.RequerySuggested, а мой шаблон ViewModel вызывает CommandManager.InvalidateRequerySuggested () как часть проверки IDataErrorInfo.

Мои ViewModels реализуют IDisposable, поэтому я попытался использовать метод OnDispose для очистки моих RelayCommands, но методы ICommand.CanExecute продолжают вызываться даже после удаления моей виртуальной машины.

Это приводит меня к выводу, что что-то (CommandManager ?, View?) Содержит ссылку на RelayCommand.

Есть ли у кого-нибудь хороший шаблон для освобождения и утилизации RelayCommands, чтобы предотвратить их повторный запрос после истечения их желаемого срока службы?

Есть ли лучший способ управлять, когда должен вызываться CanExecute?

1 Ответ

0 голосов
/ 06 октября 2011

Вы можете извлечь CommandManager.RequerySuggested и использовать реализацию RelayCommand MVVM Light .Примечание: для этого требуется, чтобы вы в явном виде вызывали RaiseCanExecuteChanged() в любое время, когда вы хотите обновить CanExecute.

...