Ik heb een probleem, simpel gezegd heb ik een ListView object waar ik een lijst met objecten aan bind doormiddel van de ItemsSource property. Dat werkt perfect, alle objecten uit in de ItemsSource implementeren de INotifyPropertyChanged interface. De ItemSource zelf de INotifyCollectionChanged interface zodat ik de listview kan informeren als er een object verdwijnt of toegevoegd word.
Tot nu toe geen problemen, maar dan komt het. Nu en dan schotel ik de gebruiker een ander scherm voor (als hij daarom vraagt). Ik zet daartoe de ItemSource van de ListView op null en dereference de ListView. Porbleem is dat de listview nooit detached van eventhandler (vereist door INotifyCollectionChanged) waarmee hij de lijst van objecten inde gaten houdt. Verder detached hij ook niet van elk individuele object.
Ik heb dit getest door de event als volgt te implementeren (zie hieronder), helaas zie ik nooit DETACH in de trace window verschijnen. Zelfde voor de objecten uit de lijst die de INotifyPropertyChanged hebben .
En het word nog leuker, als ik een nieuwe ListView maak en daar weer dezelfde lijst met items aan bind doormiddel van de ItemsSource property de lijst zelfs niet meer opnieuw bijlangs gelopen word door GetEnumerator() aan te roepen! Cached WPF nu stiekem mijn lijst met items? Daar lijkt het wel op, en ik ben er niet blij mee omdat het mijn DAL laag verstoord. Dus hoe voorkom ik dit gedrag? Is er een manier om de ListView te laten stoppen met het luisteren naar veranderingen in de ItemsSource en de objecten hier in?
Edit: Ik heb het msdn forum en stackoverflow al doorzocht maar heb niks kunnen vinden wat hier op lijkt.
Tot nu toe geen problemen, maar dan komt het. Nu en dan schotel ik de gebruiker een ander scherm voor (als hij daarom vraagt). Ik zet daartoe de ItemSource van de ListView op null en dereference de ListView. Porbleem is dat de listview nooit detached van eventhandler (vereist door INotifyCollectionChanged) waarmee hij de lijst van objecten inde gaten houdt. Verder detached hij ook niet van elk individuele object.
Ik heb dit getest door de event als volgt te implementeren (zie hieronder), helaas zie ik nooit DETACH in de trace window verschijnen. Zelfde voor de objecten uit de lijst die de INotifyPropertyChanged hebben .
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public event NotifyCollectionChangedEventHandler CollectionChanged { add { m_h += value; } remove { System.Diagnostics.Trace.Write("DETACH"); m_h -= value; } } private NotifyCollectionChangedEventHandler m_h; |
En het word nog leuker, als ik een nieuwe ListView maak en daar weer dezelfde lijst met items aan bind doormiddel van de ItemsSource property de lijst zelfs niet meer opnieuw bijlangs gelopen word door GetEnumerator() aan te roepen! Cached WPF nu stiekem mijn lijst met items? Daar lijkt het wel op, en ik ben er niet blij mee omdat het mijn DAL laag verstoord. Dus hoe voorkom ik dit gedrag? Is er een manier om de ListView te laten stoppen met het luisteren naar veranderingen in de ItemsSource en de objecten hier in?
Edit: Ik heb het msdn forum en stackoverflow al doorzocht maar heb niks kunnen vinden wat hier op lijkt.
[ Voor 5% gewijzigd door codeneos op 21-08-2010 00:51 ]
http://www.tweakers.net/gallery/119170/sys