2016-07-06 7 views
0

Mit Zwei-Wege-Android-Datenbindung, ist es möglich, eine generische inverse booleschen Konverter?Inverse Boolean mit Two Way Databinding

<Switch android:checked="@={!viewModel.myBoolean}" /> 

Wenn ich laufen diese in Android, der Schalter löst nur schnell hin und her: Zum Beispiel würde ich so etwas zu tun. Ich habe versucht, eine Zwei-Wege-Bindung app:inverseChecked nach einigen Beispielen von George Mount zu erstellen, aber ich war nicht erfolgreich (nur erhalten Fehler kann nicht finden 'inverseCheckedAttrChanged' auf View-Typ 'android.widget.Switch').

Zum Vergleich, mit Aurelia funktioniert das einfach so, wie Sie es für Zwei-Wege-Bindung erwarten würden. In WPF ist wahrscheinlich der erste Konverter, den Sie erstellen, eine Art InverseBooleanConverter, um diese Art von Dingen einfach zu lösen. Also, ich gehe davon aus, dass ich hier etwas Offensichtliches vermisse.

Antwort

1

Ich habe eigentlich nicht erwartet, dass es überhaupt funktioniert. Ich gehe davon aus, dass es die ganze Zeit hin- und herwechselt, da die Bindungen keine umgekehrte Funktion des Bindungsausdrucks haben.

Ich habe das Verhalten mit der aktuellen Version der Datenbindungsbibliothek getestet und die generierten Quellen überprüft. Mit dem einfachen Beispiel android:checked zeigen diese Hinweise, wie die Umkehrung aussehen sollte und wenden sie entsprechend an.

Auch George Berg schrieb einen Blog-Post über es vor kurzer Zeit: https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

Wenn Sie versuchen, eine app:inverseChecked zu implementieren, würden Sie auch einen @BindingAdapter("inverseChecked") als Setter, @InverseBindingAdapter(attribute="inverseChecked") als Getter und @BindingAdapter("inverseCheckedAttrChanged") zur Einstellung implementieren müssen up den Change Listener.

Letzteres könnte wie folgt aussehen:

@BindingAdapter("inverseCheckedAttrChanged") 
public static void setupInverseCheckedAttrChanged(Switch view, InverseBindingListener listener) { 
    OnCheckedChangeListener newListener = null; 
    if (listener != null) { 
     newListener = (v,b) -> listener.onChange(); 
    } 
    view.setOnCheckedChangeListener(newListener); 
}