Ich untersuche derzeit alle möglichen Lösungen, um den Benutzer informieren zu können, dh einen Dialog zu öffnen, wenn es eine Entscheidung gibt, die er treffen muss. Dies ist ein häufiges Problem mit dem MVVM-Muster und ich versuche es für das MvvmCross-Framework zu lösen.
Mögliche Lösungen könnten sein:
Was würden Sie vorschlagen?
Dialogeingabe ist ein interessantes Thema, das nicht immer gut zum Fluss der Mvvm-Datenbindung passt.
Im Allgemeinen sind einige Anwendungsfälle von Dialogen für Dinge wie:
Für einige dieser Punkte würde ich vorschlagen, dass diese hauptsächlich als reine View-Probleme modelliert werden könnten. Zum Beispiel wird das Anfordern einer Einzelpostenauswahl üblicherweise aus zusammengesetzten Steuerkennzeichen durchgeführt, die "Zieher" anzeigen, wenn sie angezapft werden - z. wie ein MvxSpinner in Ссылка
Für allgemeine Fälle, in denen die freigegebenen ViewModels den Benutzerfluss steuern sollen, enthalten die Optionen, die in MvvmCross verfügbar sind, die 3 you-Liste, die für mich praktisch erscheinen, aber ich stimme zu, dass keine von ihnen perfekt ist.
Als zusätzlichen Vorschlag gibt es einen netten Architekturvorschlag von Microsofts Pattern and Practices-Team. In Ссылка schlagen sie eine IInteractionRequest
Schnittstelle vor, die sein kann in Datenbindung speziell für diese Art von Situation verwendet.
Ihre Referenzimplementierung davon ist:
%Vor%Ein Beispiel für ViewModels Verwendung ist:
%Vor%und das ViewModel kann dies mit folgendem Befehl auslösen:
%Vor% Dabei ist Confirmation
eine einfache Klasse wie:
Für die Verwendung in den Ansichten:
Der MSDN-Link zeigt, wie ein Xaml-Client möglicherweise mithilfe von Verhaltensweisen an diesen bindet. Daher werde ich hier nicht weiter darauf eingehen.
In iOS für MvvmCross kann ein View-Objekt eine Eigenschaft wie folgt implementieren:
%Vor% Diese View-Eigenschaft verwendet ein WeakReference
-basiertes Ereignis-Abonnement, um ViewModel Raise
-Ereignisse durch eine View MessageBox
-Typ-Methode zu kanalisieren. Es ist wichtig, ein WeakReference
zu verwenden, damit das ViewModel niemals einen Verweis auf View
hat - dies kann zu Problemen mit dem Speicherleck in Xamarin.iOS führen. Die eigentliche MessageBox
-Typ-Methode selbst wäre ziemlich einfach - etwas wie:
Und die Eigenschaft könnte in einem Fluent Binding-Set gebunden sein wie:
%Vor% Für Android könnte eine ähnliche Implementierung verwendet werden - dies könnte möglicherweise ein DialogFragment
verwenden und könnte möglicherweise auch mithilfe von View
in XML gebunden werden.
Hinweis:
IInteractionRequest<T>
und InteractionRequestedEventArgs<T>
hinzufügen würden - aber für den Umfang dieser Antwort habe ich mich an die "grundlegende" Implementierung gehalten so wie ich zu dem in Ссылка vorgestellten könnte
Sie können einfach das MvvmCross UserInteraction-Plugin von Brian Chance verwenden
Wie Eugene sagt, benutze das UserInteraction-Plugin. Leider gibt es derzeit keine Windows Phone-Implementierung, also hier ist der Code, den ich in der Zwischenzeit verwendet habe:
%Vor%Sie werden feststellen, dass nicht alles implementiert ist und selbst die Bits, die begrenzt sind (Sie können beispielsweise den Text der Schaltfläche zum Abbrechen der OK-Anzeige nicht festlegen)
Natürlich musste ich das auch in setup.cs registrieren:
%Vor%Tags und Links mvvm dialog modal-dialog mvvmcross