Wie man menuitems implementieren, die Explorer-ähnliche Anwendung in WPF MVVM auf aktuelle Auswahl abhängen

StackOverflow https://stackoverflow.com/questions/2525759

  •  22-09-2019
  •  | 
  •  

Frage

Ich bin neu in WPF und MVVM, und ich arbeite an einer Anwendung beide nutzen. Die Anwendung ist ähnlich dem Windows Explorer, so eine App mit einem Hauptfenster mit Menü (ShellViewModel) betrachtet, eine Treecontrol (TreeViewModel) und eine Listensteuerung (ListViewModel). Ich mag Menüpunkte wie Bearbeiten implementieren -> Löschen, das löscht das aktuell ausgewählte Element (die in dem Baum sein können oder in der Liste)

.

Ich bin mit Josh Smith RelayCommand, und die Bindung des menuitem zu einem DeleteItemCommand im ShellViewModel ist einfach. Es scheint, wie die DeleteItemCommand Umsetzung jedoch einige ziemlich enge Kopplung zwischen dem ShellViewModel erfordert und die beiden untergeordneten Ansicht Modelle (TreeViewModel und ListViewModel) Spur der Fokus / Auswahl zu halten und die Wirkung auf die richtige Kind für die Umsetzung zu lenken. Das scheint falsch zu mir und macht mich glaube, ich bin etwas fehlt.

Schreiben eines Fokusmanager und / oder Auswahl-Manager die Buchhaltung zu tun, nicht zu hart erscheinen, und konnten zusammen ohne Kopplung der Klassen erfolgen. Das Windowing-System bereits die Verfolgung, welche Ansicht den Fokus hat, und es scheint, wie ich Code zu duplizieren würde.

Was ich bin nicht sicher, wie ich würde Route den Befehl aus dem ShellViewModel bis entweder der ListViewModel oder TreeViewModel die eigentliche Arbeit zu tun, ein Chaos des Codes ohne zu machen. Einen Tag wird die Anwendung erweitert werden, um mehr als zwei Kinder aufzunehmen, und ich mag, dass die Schale als unwissend von den Kindern wie möglich sein, dass die Erweiterung so schmerzlos wie möglich zu machen.

Mit Blick auf einige Beispiel WPF / MVVM-Anwendungen (Karl Shifflett der chiffrierten Text, Josh Smith MVVM Demo , etc.), ich habe keinen Code gesehen, das dies tut (oder ich habe es nicht verstehen).

Unabhängig davon, ob Sie denken, mein Ansatz weg Basis ist oder ich bin nur eine kleine Nuance fehlen, bitte teilen Sie mir Ihre Gedanken und Hilfe auf der Strecke zurück. Dank!

War es hilfreich?

Lösung

Es gibt einige inhärente Probleme mit Josh Smith Implementierung von MVVM. Werfen Sie einen Blick auf Ward Bell Beitrag zum Thema: http: / /neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.html . Sie können einen Blick auf einige alternative MVVM Frameworks wie Caliburn nehmen wollen, die ein Ansichtsmodell erster Ansatz nehmen und diese Kopplung brechen.

Andere Tipps

Die RelayCommand ist nur ein Weg, um einen Befehl in Ihrem Ansichtsmodell zu erhalten, die auf Ihre Ansicht gebunden werden kann.

ich glaube, ich von all den verschiedenen MVVM architektonischen Variationen Schritt zurück geneigt sein würde und Beispielanwendungen, und nur gute alte OOD verwenden. Warum nicht ein Ansichtsmodell Basisklasse von einer Art haben (dh DetailsViewModelBase) für TreeViewVm und ListViewVm. Setzen Sie ein DeleteCommand dort mit CanDelete und Delete-Methoden, die so viel Implementierung als Subklassen Aktie (oder abstrakt, wenn keine), und eine SelectedItem auch. Dann binden die SelectedItem zu den Kontrollen ähnlich dem XAML unten:

    <ListView AlternationCount="2" MinHeight="250" MaxHeight="400" 
          ItemsSource="{Binding Projects.View}" 
          IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedProject, Mode=TwoWay}"
          behaviors:SelectionBehavior.DoubleClickCommand="{Binding PickCommand}"
          ItemContainerStyle="{StaticResource listingRowStyle}"
                      >

Die Tastenbelegungen sind SelectedItem und IsSynchronizedWithCurrentItem.

HTH,
Berryl

fand ich eine Blog-Post von Kent Boogaart, dass beschreibt, was er ActiveAwareCommand nennt. Dies scheint zu tun, was ich suchte, obwohl ich es noch nicht ausprobiert. Ein Kommentar auf der Post erwähnt Prism IActiveAware als ein ähnliches Verhalten aufweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top