Laden...

MVVM ViewModel der Page wird nicht zerstört nach wechseln der Page

Erstellt von Heimwerkerking vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.348 Views
H
Heimwerkerking Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren
MVVM ViewModel der Page wird nicht zerstört nach wechseln der Page

Hallo zusammen,

ich habe ein Problem und weiß nicht mehr weiter.
Ich habe ein RibbonWindow. Unter dem Ribbon befindet sich ein Frame.
Mittels der Ribbon-Tabs werden verschiedene Pages in das Frame geladen.

Leider wird beim Wechseln der Pages nicht das gebundene ViewModel-Objekt der alten Page zerstört. Das ViewModel-Objekt der Page bleibt im Speicher erhalten. Ich wundere mich die ganze Zeit, warum so oft das gleiche Event einer Aktion im ViewModel-Objekt ausgelöst wird.
Je öfter ich die Pages wechsel, desto öfter wird das gleiche Event ausgelöst, da jedes mal ein neues ViewModel-Objekt erzeugt wird.
Der Arbeitsspeicher wird ebenfalls immer größer, aber nie kleiner.

Was kann ich tun, um die ViewModel-Objekte zu zerstören, nach dem ich die Page wechsel? Gibt es irgendeine andere Lösung?

Vielen Dank für eure Hilfe

Gruß
Heimwerkerking

I
302 Beiträge seit 2008
vor 12 Jahren

Hallo,

warum sollte die Page zerstört werden? Sie wird ja sicherlich noch als Tabpage im Control referenziert werden? Ich verstehe dein Problem mit dem Event allerdings noch nicht ganz. Warum wird ein Event auf der Page ausgelöst, die gar nicht angezeigt wird?

5.742 Beiträge seit 2007
vor 12 Jahren

Was kann ich tun, um die ViewModel-Objekte zu zerstören, nach dem ich die Page wechsel?

Du musst die Events abbestellen.
Eine Klasse bleibt so lange im Speicher, wie sie noch irgendwie im Programm erreichbar ist - und ein registrierter Eventhandler macht eine Klasse erreichbar.

Oder besser: Steiege besser gleich auf Commands um.

H
Heimwerkerking Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren

@ itstata
Die Events werden nicht in der Page ausgeführt, sondern in dem ViewModel-Objekt, welches an die Page gebunden ist. Die Page ist lediglich eine xaml-Page. Sie hat mit dem Tab des Ribbons an sich nix zu tun.

@winSharp93
Die Events kommen vom Datenmodell. Ändert sich dort etwas, müssen die Informationen an das ViewModel weitergeleitet werden, per Event. aber deine Erklärung scheint mir logisch, so lange die Events abboniert sind, bleibt das Objekt erhalten. Ich versuche mal, die Events abzubestellen.

H
Heimwerkerking Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren

So,

durch abbestellen der Events wird zumindest das Fehlverhalten meines Programms beseitigt. Schaue ich aber in meinen Taskmanager, sehe ich, dass der benötigte Arbeitsspeicher nie kleiner wird, immer nur größer, wenn ich die Pages wechsel. Dies bestätigt wohl, dass die ViewModel-Objekte noch immer erhalten sind, obwohl sämtliche Events abbestellt sind.
Leider befindet sich in den ViewModeln auch eine Collection von Objekten, die in einem TreeView dargestellt werden. Diese Collection kann sehr groß werden. Dies merkt man dann ganz deutlich im Arbeitsspeicher.

Hat noch jemand eine Idee, ob und wie man die gebundenen ViewModel zuerstören kann?

Gruß

F
10.010 Beiträge seit 2004
vor 12 Jahren

Dies bestätigt wohl, dass die ViewModel-Objekte noch immer erhalten sind, obwohl sämtliche Events abbestellt sind.

Nein, dies bestätigt nur das der Taskmanager vollkommen ungeeignet ist den .NET Speicher anzuzeigen.

Benutze einen Memory Profiler und überprüfe ob tatsächlich die Objekte noch da sind.

Auch schau dir mal genau den Lebenszyklus bei .NET an und lese auch zu Dispose Pattern etwas.