Verlorene Fokusereignisstrategie im MVVM-Muster

8

Ich entwickle eine WPF-Anwendung mit MVVM-Entwurfsmuster, die das MVVM Light Toolkit verwendet. Momentan habe ich ein Szenario wie dieses.

Ich binde ein Items-Steuerelement an eine Organisationssammlung.

  1. Eine Organisation, die aus dem Organisationsnamen und einer Liste besteht.
  2. Ein Projekt bestehend aus Projektname, Liste und neuem Mitarbeiter
  3. Ein Mitarbeiter bestehend aus Emp-Name, Kontakt-Nr. und E-Mail

Hier ist Employee selbst ein Benutzersteuerelement, das in vorhandenen und neuen Mitarbeiterdaten wiederverwendet wird.

Der Benutzer kann die vorhandenen Mitarbeiterdetails (d. h. Liste) bei jedem Lost-Fokus-Ereignis eines Steuerelements aktualisieren. Wenn es darum geht, einen neuen Mitarbeiter hinzuzufügen, habe ich die Situation mit dem Benutzersteuerelement Lost Focus Ereignis behandelt. Wenn ich das MVVM Light Toolkit EventToCommand verwende, verlasse ich EventArgs auf View Model und finde dann die Originalquelle von EventArgs (oder durchquere den visuellen Baum) ) um zu identifizieren, ob es eingefügt werden soll oder nicht, indem überprüft wird, ob der Fokus innerhalb desselben Benutzersteuerelements liegt, das die Eigenschaft IsKeyBoardFocusWithin verwendet.

Ist das die richtige Implementierung für das MVVM-Muster?

Auch wenn ich den obigen Ansatz tue, muss ich:

  1. Durchquere den visuellen Baum oder um die Originalquelle zu erhalten von EventArgs muss ich auf System.Windows.Controls verweisen.

  2. Wenn es um Unit-Tests geht, wäre es schwieriger     Spotte die EventArgs.

Es gibt also einen besseren MVVM-Ansatz für dieses Szenario ...

    
Dennis 07.05.2013, 10:47
quelle

1 Antwort

3

Wie Sie selbst erwähnt haben, sollte das Durchlaufen des Visual Tree im ViewModel vermieden werden

Eine Alternative zu diesem Ansatz könnte also ein Verhaltens-Tutorial

sein
  • Nehmen wir an, Sie erstellen ein Verhalten namens AddNewEmployeeBehavior
  • Als Nächstes fügen Sie Ihrer VM einen RelayCommand<Employee> AddNewEmployeeCommand; hinzu.
  • Erstellen Sie ein DP vom Typ RelayCommand<Employee> in AddNewEmployeeBehavior
  • In der Ansicht binden Sie den DP des Verhaltens an AddNewEmployeeCommand
  • Jetzt in AddNewEmployeeBehavior , was Sie in der VM getan haben, um zu prüfen, ob ein neues Element zur List<Employee> hinzugefügt werden muss
  • Wenn ein neues Element zur Liste in der VM / dem Modell hinzugefügt werden muss, rufen Sie den DP-Befehl im Verhalten in den neuen Mitarbeiterdetails, die in ein Employee -Objekt eingebunden sind, auf.
  • Erstellen Sie in der VM Ihren RelayCommand entsprechend, um sein Argument mit aufgerufenem Argument an die List<Employee> anzuhängen.

Nun haben Sie bei diesem Ansatz kein EventToCommand sachen in der Ansicht. Sie haben einfach ein Behaviour, das einen Befehl als DP entgegennimmt und den Befehl bei Bedarf basierend auf den Nur-Sicht-Bedingungen, die Sie haben, aufrufen kann.

Was das Testen von Einheiten betrifft, so ist das jetzt sehr einfach, denn Sie haben nur einen RelayCommand, den Sie bei Ihrem Unit-Test aufrufen können.

Dies wird als eine MVVM-Lösung gelten, da Sie in Ihrer VM keine View-bezogene Logik mehr haben und das Verhalten sie für die View behandelt.

VM - & gt; ViewModel

DP - & gt; Abhängigkeitseigenschaft

    
Viv 08.05.2013, 14:46
quelle

Tags und Links