2011-01-10 5 views
2

У меня недавно было исключение, потому что вызвала команду CanExecute() после закрытия экрана.Disposing ViewModels & CanExecute Handlers

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

Я подключаю команды, сохраняя их как свойство в ViewModel, а затем привязываю их к xaml.

так кто-нибудь знает, почему закрытое окно будет продолжать звонить по CanExecute() методам?

+0

http://social.msdn.microsoft.com/Forums/en/wpf/thread/43fc6beb-0733-424a-a915-0e03b4ce2ae0 может быть вам полезна. – Gqqnbig

ответ

2

У вас, вероятно, все еще есть обработчики команд или свойства, измененные обработчики в вашей модели просмотра. Поэтому модель представления все еще существует, и поэтому canececute все еще выполняется. Вы, вероятно, подписались на CommandManager.RequerySposed для обновления ваших команд. Это событие вызывается для ВСЕХ обновлений, а не только для окна, для которого создана ваша модель представления.

Что вы должны (или можете) сделать, это подписаться на события Closed (Window) или Unloaded (usercontrol), чтобы установить состояние IsClosed модели представления в false, а затем удалить команды или отключить их (у вас будет для реализации этой функции в RelayCommand).

2

Причина, по которой это происходит, заключается в том, что CommandManager не имеет понятия, что он должен прекратить стрельбу CanExecute до тех пор, пока обработчик не получит собранный мусор.

У меня была такая же проблема, и я решил ее, установив DataContext окна на null сразу после закрытия окна. Он отлично работает, предполагая, что команды привязаны к ViewModel (удаление его DataContext отменяет регистрацию обработчиков событий canExecute).