Ich verstehe, dass der Zweck der Android-Datenbindungsbibliothek darin besteht, dass Ansichten Daten beobachten können und wird automatisch aktualisiert, wenn sich diese Daten ändern.
Frage: Können Daten andere Daten beobachten? Kann ich zum Beispiel einen ObservableField
"abhängig von" oder "binden an" den Wert eines anderen oder eine Menge anderer ObservableField
s haben? Derzeit habe ich dies manuell implementiert - jedes Mal, wenn sich eines der "abhängigen" ObservableField
s ändert, berechne ich das abhängige Feld und aktualisiere seinen Wert.
Mein Anwendungsfall ist, dass ich alle "Logik" außerhalb der View haben möchte - also möchte ich meine gesamte Logik in die "Daten" -Klasse stellen ( ViewModel
, wenn ich darf). Ich habe eine Schaltfläche, deren Status ich abhängig vom Inhalt mehrerer anderer Felder aktivieren / deaktivieren möchte. Dieses Beispiel zeigt, was ich vorhabe.
Meine Layoutdatei sieht so aus
%Vor%Und mein View-Code ist wie folgt:
%Vor%Hier ist mein ViewModel
%Vor% Es ist nicht möglich, zwei ObservableField
s mit der Bindesyntax in der Android-Datenbindung zu binden. Sie können sie jedoch mit Code binden:
Hier habe ich angenommen, dass der leere Benutzername, das Passwort und confirmPassword ungültig sind. Sah eine sichere Annahme.
Ich sehe keinen großen Bedarf für private ObservableField
s. ObservableField
wurde entwickelt, um von der Benutzeroberfläche gebunden zu werden. Wenn dies nicht möglich ist, können Sie andere Datentypen verwenden. Wenn Sie sie für die interne Bindung nützlich finden, indem Sie Callbacks wie oben verwenden, dann gehen Sie dafür.
Ich würde vorschlagen, Ihren Ansatz zu überdenken. Einer der Hauptvorteile der Datenbindung besteht darin, expressiveren Ansichtscode zuzulassen (in diesem Fall XML). Während es einen Ausgleich gibt zwischen der Menge an Arbeit, die Sie tatsächlich im XML vs im Ansichtsmodell tun möchten, ist Ihr Fall ein perfektes Beispiel für zu viel Arbeit, die im Ansichtsmodell erledigt wird. In Ihrem Code sind es nicht die beobachtbaren Felder, die von anderen Feldern abhängen, sondern die Daten einer Ansicht, die von den Daten anderer Ansichten abhängen. Das beobachtbare Feld ist nur eine Repräsentation dieser Daten. Wenn möglich, sollten Sie versuchen, Abhängigkeiten in der Ansichtsebene und nicht in der Datenschicht zu erstellen.
Der Ansatz, den ich vorschlagen würde, besteht darin, mit der Ansichtsebene (XML) zu beginnen und anzunehmen, dass Sie kein ganzheitliches Ansichtsmodell, sondern nur an die Ansichten angehängte Daten haben. Für z.B. Du könntest mit so etwas anfangen:
%Vor%Nach diesem ersten Schritt werden Sie schnell erkennen, dass die Passwort-Validierungslogik hier keinen Sinn ergibt, weil es nicht trivial ist, also würden Sie gehen:
%Vor%
An dieser Stelle benötigen Sie nur einen Container für die Felder Benutzername, Passwort und confirmPassword, damit Sie sie weitergeben können. Fügen Sie einfach die Variable viewModel hinzu.
%Vor%
Beachten Sie, wie viel schöner das ist und Sie nicht einmal den Java-Code überhaupt sehen müssen.
P.S: Sie können den aktivierten Ausdruck auch in etwas wie ValidationUtils.validateEntries(username, password, confirmPassword)
ersetzen, wenn Sie möchten. Das ist mehr eine stilistische Wahl; Es beeinflusst die Expressivität des Ansichtscodes nicht sehr und jeder, der das XML liest, kann herausfinden, was die Ansicht zu erreichen versucht, ohne an mehreren Stellen zu suchen.
Verwenden Sie @Bindable Annotation und die Observable-Schnittstelle. Es vermeidet den Standardcode und Sie können ihn für primitive Datentypen verwenden.
%Vor%Tags und Links android data-binding