Ich möchte eine einfache Anwendung mit dem MVVM-Muster erstellen.
Diese Anwendung wird zwei Hauptteile haben:
Die Navigation wird einfach sein:
Ich habe dies zuvor mit Code hinter getan, wo der Code-Behind-Event-Handler für Menüeinträge alle Seiten geladen hatte und der, der angezeigt werden sollte, als Kind eines StackPanels geladen wurde. Dies wird jedoch in MVVM nicht funktionieren, da Sie ein StackPanel nicht manuell füllen möchten, sondern z. ein "PageItem" -Objekt mit einem DataTemplate, etc.
Also diejenigen von Ihnen, die mit MVVM eine einfache Anwendung im Click-Menü erstellt haben, was war Ihre grundlegende Anwendungsstruktur? Ich denke in etwa so:
MainView.xaml:
%Vor%wobei das Menü mit einer Sammlung von "PageItems" gefüllt ist und das DataTemplate den Titel jedes "PageItem-Objekts" als Überschrift jedes MenuItems anzeigt.
Und das ContentControl wird mit einem View / ViewModel-Paar gefüllt, das die volle Funktionalität hat, bin mir aber nicht sicher.
Erstens, ich denke, Sie sollten den Code-Behind-Event-Handler behalten, es hat keinen Sinn, einen einfachen 2-Zeilen-Event-Handler ohne praktischen Grund in ein komplexes Command-Driven-Monster zu verwandeln (und nicht Testbarkeit, das ist die Hauptsache) Menü wird jedes Mal getestet, wenn Sie die App ausführen).
Wenn Sie nun die reine MVVM-Route verwenden möchten, müssen Sie nur noch einen Befehl ausführen, indem Sie zunächst in einem Ressourcenabschnitt diesen Stil hinzufügen:
%Vor%Dieser Stil bewirkt, dass der Menüeintrag den SwitchViewCommand im angehängten Ansichtsmodell mit dem DataContext von MenuItem als Befehlsparameter auslöst.
Die tatsächliche Ansicht entspricht Ihrem Code mit einem zusätzlichen Verweis auf diesen Stil als ItemContainerStyle (gilt also für den Menüeintrag und nicht für den Inhalt des DataTemplate):
%Vor%Jetzt im Ansichtsmodell, das Sie benötigen (ich habe Strings verwendet, weil ich Ihren PageItem-Code nicht habe):
%Vor%Und verwenden Sie die von Ihnen verwendete Befehlsklasse, damit der Befehl diesen Code aufruft:
%Vor%Wenn der Benutzer nun auf einen Menüeintrag klickt, ruft der Menüeintrag den SwitchViewCommand mit dem Seiteneintrag als Parameter auf.
Der Befehl ruft den DoSwitchViewCommand auf, der die SelectedPageItem-Eigenschaft
festlegen wirdDie Eigenschaft wird die NotifyPropertyChanged auslösen, die die Benutzerschnittstelle über die Datenbindung aktualisiert.
Oder Sie können einen 2-zeiligen Event-Handler schreiben, Ihre Wahl
Ich könnte mir eine ObservableCollection in der VM vorstellen, die alle aufrufbaren Seiten aus dem Menü enthält. Dann binden Sie ein ItemsControl und das ContentControl daran, damit das ContentControl immer das CurrentItem aus dieser Liste anzeigt. Natürlich wird das Menü nur an eine Title-Eigenschaft gebunden während das ContentControl den gesamten Artikel übernimmt und je nach Typ eine passende Ansicht einfügt.
Eine andere Option besteht darin, statt eines Menüs eine ListBox zu verwenden, die ListBox so zu gestalten, dass sie wie ein Menü aussieht, und dann an den ausgewählten Wert zu binden:
%Vor%Beachten Sie das IsSynchronizedWithCurrentItem="True", um das ausgewählte Element und das {Binding PageItemsMainMenu /} mit dem nachfolgenden Schrägstrich festzulegen, um es zu verwenden.
Tags und Links wpf mvvm application-design