我的控件的双向数据绑定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的控件的双向数据绑定相关的知识,希望对你有一定的参考价值。

假设我有自定义视图,定义如下,以支持数据绑定:

@InverseBindingMethods({@InverseBindingMethod(type = com.jaredrummler.materialspinner.MaterialSpinner.class,
        attribute = "app:selectedIndex", event = "app:selectedIndexAttrChanged", method = "getSelectedIndex")})
public class MaterialSpinner extends TextView
{
 //...............
   public Integer getSelectedIndex()
   {
       return selectedIndex;
   }

  @InverseBindingAdapter(attribute = "app:selectedIndex")
  public static Integer getSelectedIndex(MaterialSpinner spinner)
   {
       return spinner.getSelectedIndex();
   }
  //**************

接下来我需要创建事件selectedIndexArttrChanged

@BindingAdapter({"app:selectedIndexAttrChanged"})
public static void setSelectedIndexListener(MaterialSpinner view, final InverseBindingListener selectedIndexChange)
{ 
}

但我不确定如何设置事件。由于它是静态的,我不能把notifyPropertyChanged放在那里。你有什么建议吗?

如果我使BindingAdapter非静态,我的应用程序崩溃并显示错误消息:

java.lang.IllegalStateException:ActivityMainBinding类中必需的DataBindingComponent为null。 MaterialSpinner中的BindingAdapter不是静态的,需要使用从DataBindingComponent检索的对象。如果不使用带有DataBindingComponent的通胀方法,请使用DataBindingUtil.setDefaultComponent或使所有BindingAdapter方法保持静态。

答案

我将假设你的MaterialSpinner不延伸AdapterView。如果是这样,您应该已经为android:selectedItemPosition启用了双向数据绑定。

有一点是你不需要InverseBindingAdapterInverseBindingMethod。你只需要一个或另一个。在你的情况下,由于你的InverseBindingAdapter实际上只是调用getter,你应该保留InverseBindingMethod(代码较少)。

要挂钩绑定侦听器,请执行以下操作:

@BindingAdapter({"app:selectedIndexAttrChanged"})
public static void setSelectedIndexListener(MaterialSpinner view,
     final InverseBindingListener selectedIndexChange)
{
    if (selectedIndexChange == null) {
        view.setOnItemSelectedListener(null);
        return;
    }
    view.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
            selectedIndexChange.onChange();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            mAttrChanged.onChange();
        }
    });
}

我建议您查看带有数据绑定的BindingAdapter的源代码。例如,如果您使用Android Studio查找AdapterViewBindingAdapter,您将看到可用于模板的实现。

以上是关于我的控件的双向数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

WinForm 双向数据绑定

WPF,mvvm,在combobox中嵌套了checkbox控件,数据绑定完成后,无法实现双向绑定

10《Vue 入门教程》Vue 双向绑定指令

当我以编程方式更改用户控件时,如何让数据绑定双向工作?

4.Vue双向绑定

观察者模式--双向数据绑定