2010-09-24 3 views
0

У нас есть несколько сценариев в нашем приложении WPF/MVVM, где окно запускается и открывается в пределах одного метода. Очень упрощенно пример:Вопрос о недостатке RemoveHandler в функции приложения WPF

Private Sub subOpenWindow 
    Dim myViewModel = New Viewmodel1 'create viewmodel that Window1 will use as datacontext 
    AddHandler myViewModel.SomeEvent, AddressOf subHandleSomeEvent 

    Dim myWindow = New Window1(ViewModel1) 
    myWindow.Show 
End Sub 

Private Sub subHandleSomeEvent 
'do some stuff 
End Sub 

Теперь - мы обсуждаем ли или нет использование AddHandler без последующего RemoveHandler (обычно большой нет-нет) вызывает у нас проблемы с памятью, учитывая, что декларация AddHandler является decalred и используется внутри метода subOpenWindow и нет очевидных способов выполнения вызова RemoveHandler. Мы могли бы переместить объявление viewmodel на более глобальный уровень, но это не кажется чистым.

Вопрос в следующем: необходим ли в этом сценарии RemoveHandler? Или сборка мусора будет очищена правильно, как только окно будет закрыто?

ответ

0

Вы можете обработать событие Закрытое окно, чтобы удалить обработчик. Как бы то ни было, ссылка, созданная текущим классом (тот, который содержит обработчик), действительно сохраняет myViewModel в памяти. Альтернативой могло бы быть изучение слабых событий - см. here для деталей.

+0

Спасибо Paven - в итоге мы добавили немного логики в отношение viewmodel/parent viewmodel дочернего элемента и теперь просто выписываем RemoveHandler, когда ребенок uc/vm закрывается. – Gatmando