#wpf
#wpf
Вопрос:
У меня есть панель инструментов, которая имеет свою собственную модель представления. Я использовал привязку команды для обработки кликов в модели представления. Я использовал командный класс codeplex, который поставляется с инструментарием. Когда я закрываю окно и открываю другое окно в том же приложении, я вижу, что вызывается мой метод CanExecute() ранее закрытого окна. Я подтвердил это с помощью CommandManager.InvalidateRequerySuggested() указывает, что CommandManager все еще хранит ссылку!! Предполагается, что CommandManager содержит слабую ссылку, но по какой-то причине он вообще не освобождает делегатов.
Что я здесь сделал не так? Как я могу преодолеть эту проблему?
Ответ №1:
Причина, по которой это происходит, заключается в том, что CommandManager понятия не имеет, что он должен прекратить запуск CanExecute, пока обработчик не соберет мусор.
У меня была такая же проблема, и я решил ее, установив DataContext окна null
сразу после закрытия окна. Он отлично работает, предполагая, что команды привязаны к ViewModel (удаление DataContext отменяет регистрацию обработчиков событий CanExecute).
Ответ №2:
В качестве дополнения к ответу surfen я решил эту проблему, добавив строку
CommandBindings.Clear()
в Closed
событии моего окна. Это должно сработать, если все ваши привязки команд выполняются в окне, или же вы должны вызвать его для любого элемента управления, которому принадлежат привязки команд.