MvvmCross Dialog

7

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:

  • Passen Sie den MvxPresenter an, um Dialoge anzeigen zu können, aber das sieht für mich etwas hässlich aus
  • Fügen Sie eine Dialog-Schnittstelle in das Core-Projekt ein und verwenden Sie Inversion of Control, um die Implementierung aus dem UI-Projekt in das Core-Projekt
  • zu injizieren
  • Verwenden Sie das MvxMessenger-Plugin und teilen Sie Nachrichten zwischen dem Core- und UI-Projekt. Klingt wie eine gute Idee aber vielleicht komplizierter zu entwickeln ...

Was würden Sie vorschlagen?

    
Fabien 04.09.2013, 08:33
quelle

3 Antworten

13

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:

  1. Hinzufügen einer Ja / Nein-Bestätigungsoption zu einer Absenden-Schaltfläche
  2. Anfordern zusätzlicher einzelner Eingaben - z. eine Auswahl aus einer Liste
  3. bietet eine Auswahl an Aktionen (z. B. löschen, bearbeiten oder duplizieren?)
  4. bietet eine Bestätigungsmeldung
  5. Anforderung zusätzlicher komplexer Eingaben - z.B. Sammeln einer Gruppe von Feldern Vorname / Nachname / Alter / Akzeptiere_terms

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:

%Vor%

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:

%Vor%

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:

  • Ich glaube, dass die grundlegende Interaktion (meiner Meinung nach) verbessert werden könnte, wenn wir weitere Definitionen für 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
  • einige zusätzliche Hilfsklassen könnten auch helfen, den View-Subscription-Code zu vereinfachen
Stuart 04.09.2013, 21:58
quelle
6

Sie können einfach das MvvmCross UserInteraction-Plugin von Brian Chance verwenden

    
Eugene Smykov 26.10.2013 06:04
quelle
3

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%     
Coatsy 14.03.2014 06:58
quelle