WPF DateTemplate eventhander memoryleak
-
Hallo Leute,
nehmen wir ich habe ein UserControl, welche eine ListView beinhaltet:
<ListView Grid.Column="0" ItemsSource="{Binding TypeItems}"> <ListView.ItemTemplate> <DataTemplate DataType="local:TypeItemViewModel"> <Border Background="Gray" BorderBrush="White" BorderThickness="2" Tag="{Binding}" PreviewMouseLeftButtonDown="UIElement_OnPreviewMouseLeftButtonDown"> <TextBlock Text="{Binding Info,Mode=OneTime}"></TextBlock> </Border> </DataTemplate> </ListView.ItemTemplate> </ListView>
und habe ich eine ObservableCollection ,welche in an die Liste binde "TypeItems".
In Meinen DataTemplate habe ich einen "PreviewMouseLeftButtonDown" handler.
Nun meine Frage für jede Instance wird ja das DataTemplate instanziert und eine der handler registriert. Was passiert aber wenn ich Elemente aus der Liste lösche? werden die Handler dann auch wieder abgemeldet?
Wenn nein, wie löse ich das Problem dann?
Vielen Dank euch
-
Versteh ich grad nicht.
Wenn du Elemente aus der Liste löscht, dann werden auch die GUI Elemente aus dem List-View entfernt. Dadurch werden die vermutlich unreachable. Und damit werden auch die diversen Event Handler Delegates in den GUI Elementen unreachable. D.h. die werden dann irgendwann collected.Blöd wird das ganze wenn die GUI Elemente sich auf nen Event der Form/Anwendung/... registrieren. Umgekehrt sollte es aber kein Problem sein.
-
@hustbaer sagte in WPF DateTemplate eventhander memoryleak:
Blöd wird das ganze wenn die GUI Elemente sich auf nen Event der Form/Anwendung/... registrieren. Umgekehrt sollte es aber kein Problem sein.
Ahhh genau da hast du Recht.. in diese Richtung hätte ich dann ein Problem. Danke
-
Ja. Wobei das mit Standard WPF Zeugs auch automagisch funktionieren sollte. Also z.B. so ein List-View hängt sich natürlich auf Events der Data-Source drauf. Ich meine mich aber zu erinnern dass WPF da in irgend einem Event-Handler (Form-Unload oder Close oder sowas) Magie eingebaut hat die diese Handler wieder entfernt, so dass "alte" Controls nicht weiter upgedated werden wenn sich in der Data-Source was ändert.
Sobald man aber selbst Controls implementiert die sich auf irgendwelche Events draufhängen muss man das berücksichtigen.
-
@hustbaer sagte in WPF DateTemplate eventhander memoryleak:
(Form-Unload oder Close oder sowas)
ja das meine ich auch mal gelesen zu haben, zum sollte man observableCollection statt IEnumerale /NotifyPropertyChange
verwenden um leak zu vermeiden.. aber is schon länger her als ich darüber gelesen hab