Laden...

Wie kann man unter WPF ein neues Fenster MVVM-konform öffnen?

Erstellt von JimStark vor 3 Jahren Letzter Beitrag vor 3 Jahren 911 Views
Hinweis von MrSparkle vor 3 Jahren

Abgeteilt von Wie verschiedene Windows mit MVVM synchron halten?

JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

Nochmal dazu eine Frage:

Bisher habe ich es so gemacht:
im MainWindowViewModel habe ich einen Command der ein neues Fenster öffnet, dem das zugehörige ViewModel zuweist und den DbService mitgibt.

Jetzt sollte die UI Schicht ja eigentlich von den ViewModels komplett getrennt sein. Also das MainWindoViewModel das zweite Fenster gar nicht kennt.

Wie mache ich das am besten, dass ich das in XAML definiere? Also einen Command der ein neues Fenster öffnet, ViewModel mitgibt. Brauche ich für sowas dann doch Codebehind?

5.657 Beiträge seit 2006
vor 3 Jahren

Das Thema wurde bereits mehrfach besprochen, z.B. hier: WPF: Öffnen eines neuen Windows

Kurz gesagt gibt es folgende Möglichkeiten:*Window.Show() im Command aufrufen und damit das MVVM-Pattern zu verletzen, *Einen WindowsService implementieren oder eine fertige Implementierung aus einem MVVM-Framework verwenden, *Gar keine Fenster verwenden, sondern Bereiche im Hauptfenster ein- und ausblenden

Ich selbst benutze im Prinzip nur die letzte Variante, das ist am einfachsten umzusetzen (über ein DataTemplate pro Bereich) und am übersichtlichsten für den Benutzer.

Weeks of programming can save you hours of planning

3.170 Beiträge seit 2006
vor 3 Jahren

Hallo,

Du kannst auch mal in meiner Antwort hier schauen:
Object von Window zu Window weiter geben

Unten im Beitrag habe ich ein paar Möglichkeiten für diese Problematik aufgelistet.
Der dort erwähnte ViewManager entspricht dabei dem WindowsService, den MrSparkle nannte.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

Der dort erwähnte ViewManager entspricht dabei dem WindowsService, den MrSparkle nannte.

Danke für den Tipp!


    public interface IWindowManager
    {
        void ShowOrderWindow(OrderViewModel order);
...
    }

So habe ich es jetzt gemacht, das MainViewModel initalisiert den WindowManager, und nutzt den Manager dann um die Fenster aufzurufen.
Dann ist der Manager ein Ausbruch aus dem Pattern. Aber ich denke noch ein recht übersichtlicher 👍

Danke euch!