2016-10-31 5 views
0

WPF 응용 프로그램에서 다른 창을 열고 해당 DataContext를 ViewModel 클래스의 인스턴스로 설정하는 XAML 창이 있습니다. 다른 것들 중, 뷰의 ListView는 ViewModel의 ObservableCollection에 바인딩됩니다.수동으로 null로 설정하지 않으면 ObservableCollection을 수동으로 설정하지 않는 한

ViewModel은 초기화 될 때 약 7,000 개의 항목을로드하며 ListView는이를 (VirtualizedStackPanel에서) 표시합니다.

VS2015의 디버그 성능 모니터에서 두 번째 창이 닫힌 후 7000 개 항목이 포함 된 ViewModel에 대한 참조가 더 이상 없다는 사실을 알게되었습니다. 이러한 항목은 여전히 ​​메모리에 남아 있습니다. 그들은 세대 0, 1 및 2의 여러 가지 가비지 콜렉션에서 살아남습니다 (그리고 그들은 LOH에 없습니다).

오랜 조사 끝에 창을 닫을 때 7000 항목의 entier 컬렉션을 null로 설정하고 OnPropertyChanged 이벤트를 발생 시키면 즉시이 항목 컬렉션이 수집된다는 것을 알게되었습니다. 이 컬렉션을 VS 힙 스냅 샷 도구의 뿌리로 따라 가려고하면 XAML 컨트롤 및 요소가 엉망으로 연결될 수 있으므로이 컬렉션을 가져올 수 있습니다.

제 질문은 :이 정상적인 동작입니까? 항상 내 물건을 무효화해야합니까? 나는 무엇을 놓칠 수 있 었는가?

+0

"두 번째 창이 닫힌 후"- 정확히 어떻게 표시됩니까? –

+0

창 닫기 버튼에서 닫힙니다. XAML의 코드 숨김에는 Closed 및 Closing 이벤트에 대한 메서드가 있으며 ViewModel을 호출하여 개체를 정리합니다. – user884248

+0

DataContext를 null로 설정하려고 했습니까? – Clemens

답변

0

가장 많이 발생하는 원인은 무언가를 ViewModel의 약한 방법으로 이벤트에 구독 한 두 번째 XAML 창보기 안에 입력 한 것입니다. Windows에서 수행 한 View-to-VM 구독은 기본적으로 취약하므로 누설되지 않으므로 걱정할 필요가 없습니다. 먼저 VM 이벤트를 구독 할 수있는 작성한 Behaviors (예 : ObservableCollection.CollectionChanged 또는 ICommand.CanExecuteChanged)를 찾아 보겠습니다.

관련 문제