Laden...

Wie sollt eich ein ViewModel Zurücksetzen / Disposen? Oder lieber neu deklarieren?

Erstellt von echdeneth vor 3 Jahren Letzter Beitrag vor 3 Jahren 667 Views
echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren
Wie sollt eich ein ViewModel Zurücksetzen / Disposen? Oder lieber neu deklarieren?

Moin,

ich wollt euch mal fragen ob das was ich gemacht habe, halbwegs unter "Sauberer Code" fällt.

Ich habe mehrere UserControl (US), die im MainView als Resource gelistet sind.
Nun bleiben ja - ohne den auskommentierten Teil - die ViewModels erhalten nachdem
man eine UC ausgewählt hat. Mit Disposen habe ich keine Erfahrung und das neu deklarieren funzt eigentlich.
Gibt es da bedenken und sollte ich es anders machen?


<Window.DataContext>
        <vm:MainViewModel/>
    </Window.DataContext>

    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:ProduktionslisteViewModel}">
            <v:ProduktionslisteView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:BestellungenMainViewModel}">
            <v:BestellungenOverView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:LieferungenMainViewModel}">
            <v:LieferungenOverView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:PrioViewModel}">
            <v:PrioView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:ReklamationenViewModel}">
            <v:ReklamationenView />
        </DataTemplate>
    </Window.Resources>

MainViewModel:


        private ICommand _produktionCommand;
...

        private object _produktionView;
...

_produktionView = new ProduktionslisteView();
...


        public object ProduktionCommand => _produktionCommand ??
            (_produktionCommand = new RelayCommand(x => { GotoProduktionView(); }));
...
        private void GotoProduktionView()
        {
            CurrentView = _produktionView;
            //_produktionView = new ProduktionslisteView();
        }
...

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

2.071 Beiträge seit 2012
vor 3 Jahren

Dispose brauchst Du dann, wenn Du Dinge aufräumen musst, bevor Du die Arbeit abschließen kannst.
Bei nativen Dingen (z.B. Datei-Zugriffe oder irgendetwas gegen die WinAPI) solltest Du Dispose verwenden, aber da ist es viel häufiger, dass eine Klasse intern etwas nutzt, das disposed werden muss.

Musst Du irgendetwas aufräumen? Dann brauchst Du Dispose.
Musst Du nix aufräumen? Dann brauchst Du kein Dispose.

Allerdings solltest Du nie in die Situation kommen, wirklich ein ViewModel aufräumen zu müssen, denn das ist dann sehr wahrscheinlich eine Funktionalität, die in eine eigene Klasse gehört und von außen (IoC) verwaltet werden sollte.

Wenn Du ViewModel-Instanzen weg werfen willst, dann setz einfach die gebundene Property auf null.
Das Binding bekommt das mit und schmeißt das Control weg und der GC tut den Rest.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

... setz einfach die gebundene Property auf null ...

hatte das probiert:

private void GotoProduktionView()
        {
            CurrentView = _produktionView;
            _produktionView = null; [B]<= Mist...[/B]
        }

Meintest du:

private void GotoProduktionView()
        {
            CurrentView = _produktionView;
            CurrentView  = null; [B]?[/B]
        }

Ich wüsste auch nicht an welcher anderen Stelle ich CurrentView auf Null setzen sollte.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

4.921 Beiträge seit 2008
vor 3 Jahren

Warum benutzt du die View-Klasse ProduktionslisteView (anstatt der ViewModel-Klasse) in deinem MainViewModel?
Das wurde doch schon ausgiebig in Zugriff auf Property einer anderen Klasse/ViewModel besprochen...

PS: Und dein letzter Beitrag deutet darauf hin, daß du Referenzen nicht wirklich verstanden hast.

2.071 Beiträge seit 2012
vor 3 Jahren

Deine Methode macht relativ wenig Sinn.

Du willst eine neue View anzeigen, dann setz die Property entsprechend.
Wenn die Referenz des alten ViewModels dabei weg fliegt, würde auch der GC irgendwann aufräumen.

Dein Snippet sieht aber danach aus, dass Du zig Variablen mit ViewModels hast und in dem Fall würde nicht aufgeräumt werden, immerhin gibt's die Referenz noch.

Wenn Du stattdessen das ViewModel immer neu erzeugst, die alte Referenz überschreibst und sie dadurch nirgendwo mehr gehalten wird, wird der GC aufräumen.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

...Das wurde doch schon ausgiebig in
>
besprochen...

Ich hatte es ja eigentlich so gemacht... (naja, Dachte...) 🙁

...daß du Referenzen nicht wirklich verstanden hast...

möglicherweise, leider - ich kann leider nur begrenzt abstrahieren...

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Warum benutzt du die View-Klasse ProduktionslisteView (anstatt der ViewModel-Klasse) in deinem MainViewModel?
Das wurde doch schon ausgiebig in
>
besprochen...

PS: Und dein letzter Beitrag deutet darauf hin, daß du Referenzen nicht wirklich verstanden hast.

Switching between WPF XAML views using MVVM DataTemplate Ich habe deinen Link als Vorlage benutzt

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

4.921 Beiträge seit 2008
vor 3 Jahren

In dem Link steht aber auch, daß es eine verbesserte Version ohne Views in den ViewModels gibt: Navigating between views in WPF / MVVM (mir ging es ja zuersteinmal darum, daß du siehst, wie DataTemplates aufgebaut sind).
Persönlich finde ich aber sowieso meinen zweiten geposteten Link Navigation mit WPF und MVVM besser (der aber evtl. für Anfänger schwerer zu verstehen ist, da dort zusätzlich noch ein IOC/DI-Container benutzt wird - was aber auch zu den Grundlagen professioneller Entwicklung gehört).

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Navigating between views in WPF / MVVM

Schau ich mir an und baue ich mal nach....

Persönlich finde ich aber sowieso meinen zweiten geposteten Link
>
besser

Den Link kenne auch meinen eigenen Recherchen. Ich störte mich ein wenig an MVVM Light,
dachte ich muss es erstmal ohne probieren.

Leider kam es bei MVVM Light zu Fehlern bei den Namespaces die ich trotz Recherche nicht beheben konnte.

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein