Привязка команды — CanExecute() вызывается даже после закрытия окна в приложении WPF

#wpf

#wpf

Вопрос:

У меня есть панель инструментов, которая имеет свою собственную модель представления. Я использовал привязку команды для обработки кликов в модели представления. Я использовал командный класс codeplex, который поставляется с инструментарием. Когда я закрываю окно и открываю другое окно в том же приложении, я вижу, что вызывается мой метод CanExecute() ранее закрытого окна. Я подтвердил это с помощью CommandManager.InvalidateRequerySuggested() указывает, что CommandManager все еще хранит ссылку!! Предполагается, что CommandManager содержит слабую ссылку, но по какой-то причине он вообще не освобождает делегатов.

Что я здесь сделал не так? Как я могу преодолеть эту проблему?

Ответ №1:

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

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

Ответ №2:

В качестве дополнения к ответу surfen я решил эту проблему, добавив строку

 CommandBindings.Clear()
  

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