Frage zur ViewModel-Verwaltung (DesignTime vs Laufzeit)

7

Ich habe eine ziemlich einfache WPF-Benutzeroberfläche, bei der Benutzeranfragen eine neue Registerkarte in meinem TabControl öffnen. Das TabControl ist an ein ObservableCollection<ViewModelBase>

gebunden

Ich füge ViewModel-Instanzen zu dieser Sammlung hinzu, und der Inhalt der entsprechenden Registerkarte wird basierend auf Vorlagen wie folgt angezeigt:

%Vor%

Nehmen wir nun an, dass ich innerhalb des UserUploads-Steuerelements eine VM in XAML anschließen möchte, um beim Entwerfen zu helfen, wie folgt:

%Vor%

Diese Eigenschaft gibt zur Laufzeit eine VM mit Live-Diensten und zur Entwurfszeit eine VM mit Mock-Daten zurück.

Frage: Wird dieser XAML beim Binden eines TabItems-Inhalts an eine ViewModel-Instanz und beim Verlassen der obigen dataTemplate zum Rendern der richtigen View-Funktion eine Rolle spielen? Wenn ja, gibt es eine Möglichkeit, diese beiden Konzepte zusammenzuarbeiten?

    
Adam Rackis 14.07.2011, 15:55
quelle

3 Antworten

22

Es gibt einen einfacheren Weg, dies zu tun. Habe ein DesignTimeUserAdministrationViewModel und befülle es mit statischen Daten im Konstruktor und verweise das in UserControl als:

%Vor%

Auf diese Weise haben Sie eine Entwurfszeit-Testdatenbindung an d:DataContext und Laufzeit-Live-Daten, die an die tatsächliche DataContext gebunden sind. Mehr Details hier .

    
anivas 14.07.2011, 16:51
quelle
1

Ja, ich denke, es wird Ihre aktuelle Konfiguration stören

Der ViewModelLocator ist eine statische Klasse, die zur Entwurfszeit ein Dummy-Objekt und zur Laufzeit ein statisches ViewModel zurückgibt. Dies bedeutet, dass

  • Der ViewModelLocator, nicht Ihr ParentViewModel, enthält Ihre TabViewModels

  • Sie können nicht mehrere Instanzen desselben Tabs (ViewModel) gleichzeitig öffnen

  • Sie können die Registerkarten "Öffnen" und "Geschlossen" nur verwalten, wenn Sie das Benutzersteuerelement referenzieren. Dies ist eine Verletzung des MVVM-Prinzips, bei dem ViewModel nicht über die Ansicht

  • verfügt
  • Sie können keine neuen Kopien des TabViewModel mit parametrisierten Konstruktoren instanziieren. Zum Beispiel OpenTabs.Add(new CustomerViewModel(CustomerId));

Vielleicht könnte eine Alternative ein Konverter sein? Eine, die ein statisches Objekt zur Entwurfszeit oder das gebundene Objekt zur Laufzeit zurückgibt? Ich habe noch nie so etwas getestet, aber in der Theorie sollte es funktionieren:)

    
Rachel 14.07.2011 16:49
quelle
1

Das eingebaute MS-Zeug ist nicht schlecht, aber eine andere elegantere und strukturell gesundere Alternative, die ich in mein Projekt einfüge, ist: Ссылка

Grundsätzlich verwenden Sie das MVVM Light-Toolkit mit dem mitgelieferten SimpleIoc-Container und haben die Möglichkeit, Daten für die folgenden drei Szenarien bereitzustellen:

Entwurfszeit, Laufzeit und Testzeit.

Noch besser, der Sinn von MVVM Light besteht darin, dass Ihre Sachen in Blend direkt editierbar sind und es gibt eine ganze Reihe von Videos und Blogs und Beispiel-Apps, die alles beschreiben. Ich wünschte, ich hätte dies früher in meinen WPF-Erkundungen gefunden.

    
Dirk Bester 14.04.2014 21:33
quelle

Tags und Links