Wie wechsle ich Ansichten innerhalb einer Ansicht?

Ich mache eine WPF-Anwendung, die das MVVM Light Framework verwendet.

Was ich versuche, ist ein Anmeldeformular in einer Ansicht. Wenn der Benutzer eine Schaltfläche in dieser Ansicht drückt, wird ein Login-Befehl für das angehängte ViewModel gestartet. Von dort möchte ich entweder ein neues Fenster öffnen, das den Rest der Anwendung enthält, oder einfach die Ansichten aus demselben Fenster wechseln.

Momentan habe ich es so, dass es eine Ansicht namens MainView gibt, die ein Inhaltssteuerelement innerhalb von View1 enthält. Um jedoch zu View2 zu wechseln, muss ich die Schaltfläche dafür in MainView einfügen und nicht in View1, wo er hingehört.

Irgendein Rat?

Normalerweise mache ich dies auf zwei Arten:

Wenn das Anmeldefenster einmalig ist, bevor die Anwendung OnStartup() wird, lege ich es in die OnStartup() Methode des Application Objekts

 protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // Login var login = new LoginDialog(); var loginVm = new LoginViewModel(); login.DataContext = loginVm; login.ShowDialog(); if (!login.DialogResult.GetValueOrDefault()) { // Error is handled in login class, not here Environment.Exit(0); } // If login is successful, show main application var app = new ShellView(); var appModel = new ShellViewModel(); app.DataContext = viewModel; app.Show(); } 

Die andere Art, wie ich dies normalerweise mache, ist durch ein ShellViewModel oder ApplicationViewModel das alle meine Fensterverwaltung übernimmt. Diese Methode verwendet DataTemplates zum Definieren jedes Bildschirms und verwendet ein ContentControl als Platzhalter für den aktuellen Bildschirm in der ShellView oder ApplicationView .

Normalerweise kombiniere ich dies mit einem Ereignissystem, wie etwa dem EventAggregator Microsoft Prism, damit es auf Nachrichten eines bestimmten Typs wie OpenWindow oder CloseWindow Nachrichten CloseWindow kann. Wenn Sie interessiert sind, habe ich einen Blogbeitrag über die Kommunikation zwischen ViewModels , der Ihnen eine bessere Vorstellung davon vermitteln soll, wie ein Ereignissystem aussieht.

Zum Beispiel könnte mein ShellViewModel mit dem Anzeigen eines LoginViewModel (ein DataTemplate wird verwendet, um WPF LoginViewModel das LoginViewModel mit dem LoginView zu zeichnen) und würde den Empfang von Nachrichten des Typs SuccessfulLogin abonnieren. Sobald das LoginViewModel eine SuccessfulLogin Nachricht ShellViewModel , schließt das LoginViewModel das LoginViewModel und ersetzt es durch das ApplicationViewModel . Ein Beispiel dafür finden Sie in meinem Artikel zur Navigation mit MVVM

MainWindow Sie Ihre Ansichten in Page Elemente ein, erstellen Sie in Ihrem MainWindow einen Frame und verweisen Sie auf den Quellcode auf Ihre erste Seite.

Von da an können Sie den NavigationService Service des Frames verwenden, um Ihren Frame zu einer anderen Ansicht zu navigieren, ähnlich einem Webbrowser.