Утилизация ViewModels и CanExecute Handlers - PullRequest
2 голосов
/ 10 января 2011

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

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

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

2 голосов
/ 10 января 2011

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

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

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