2016-07-06 29 views
0

使用雙向Android數據綁定,是否有可能具有通用逆布爾轉換器?例如,我想要做這樣的事情:使用雙向數據綁定的逆布爾值

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

當我在Android中執行此操作時,交換機只是快速地來回發射。我嘗試創建一個雙向綁定app:inverseChecked,下面是來自George Mount的一些示例,但我沒有成功(只是不斷收到錯誤,指出無法在View類型'android.widget.Switch')上找到事件'inverseCheckedAttrChanged'。

作爲一個比較,使用Aurelia這只是作爲你所期望的雙向綁定。在WPF中,可能你製作的第一個轉換器是某種InverseBooleanConverter,可以輕鬆解決這些問題。所以,我假設我在這裏錯過了一些明顯的東西。

回答

1

我其實並沒有指望它能夠工作。我認爲,它總是來回切換,因爲綁定不會應用綁定表達式的反函數。

這就是說,我測試了當前數據綁定庫版本的行爲並檢查了生成的源代碼。通過android:checked這個簡單的例子,這些節目會記錄倒數應該是什麼樣子並適當地應用它。

而且喬治·芒寫了一個博客文章關於它的前一段時間:https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

如果試圖實現一個app:inverseChecked,你還不得不實施設置@BindingAdapter("inverseChecked")作爲二傳手,@InverseBindingAdapter(attribute="inverseChecked")作爲getter和@BindingAdapter("inverseCheckedAttrChanged")改變聽衆。

後者可能看起來像以下:

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