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.
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:
Durchquere den visuellen Baum oder um die Originalquelle zu erhalten von EventArgs muss ich auf System.Windows.Controls verweisen.
Wenn es um Unit-Tests geht, wäre es schwieriger Spotte die EventArgs.
Es gibt also einen besseren MVVM-Ansatz für dieses Szenario ...
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
seinAddNewEmployeeBehavior
RelayCommand<Employee> AddNewEmployeeCommand;
hinzu. RelayCommand<Employee>
in AddNewEmployeeBehavior
AddNewEmployeeCommand
AddNewEmployeeBehavior
, was Sie in der VM getan haben, um zu prüfen, ob ein neues Element zur List<Employee>
hinzugefügt werden muss
Employee
-Objekt eingebunden sind, auf. 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
Tags und Links wpf mvvm mvvm-light