与Xamarin.Android/Android上的集合进行双向数据绑定

时间:2017-10-05 04:57:34

标签: android mvvm data-binding xamarin.android mvvm-light

我有一个带有一些EditTexts的UI,这组edittexts可以根据列表中的项目数重复次数(不是太多,但最多3到10次)。

用户可以编辑/修改/删除项目或编辑编辑文本的值。目前我正在使用“AddView / RemoveView”手动执行此操作,手动处理状态等,但是由于我有许多这样的场景,所以这是很多工作。

我们有一个具有相同功能的网络应用程序,我们正在使用AngularJS来处理所有这些,正如您所知,这非常容易。

是否有更紧密的方法将axml / xml视图与一个集合(可能是一个Observable集合,至少来自后面的代码)绑定在一起,它将处理集合更改以及单个字段更改,而无需执行所有操作这个手动。在某些情况下,我也必须显示图像。

此外,我尝试使用ListView,但它无法正常工作。

1 个答案:

答案 0 :(得分:1)

  

是否有更紧密的方法将axml / xml视图与一个集合(可能是一个Observable集合,至少来自后面的代码)绑定在一起,它将处理集合更改以及单个字段更改,而无需执行所有操作这是手动。

答案是否定,没有。 Android的视图必须在创建时绑定到某些上下文/活动。它们不能被隔离,因此添加/删除EditText必须由您自己实现。

目前,最接近您要求的方法是创建ObservableCollection并监听CollectionChanged事件,并在CollectionChanged添加/删除容器中的视图时:

[Activity(Label = "Demo", MainLauncher = true)]
public class MainActivity : Activity
{
    Button btnAdd;
    ObservableCollection<View> oc;
    LinearLayout container;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        btnAdd = FindViewById<Button>(Resource.Id.btnAdd);
        btnAdd.Click += BtnAdd_Click;
        GenerateET(Resource.Id.container, this, 3);
    }

    private void BtnAdd_Click(object sender, System.EventArgs e)
    {
        EditText et = new EditText(this);
        et.Text = "test";
        et.LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
        oc.Add(et);
    }

    public void GenerateET(int resId, Activity activity,int num)
    {
        //create an observable collection
        oc = new ObservableCollection<View>();
        container = activity.FindViewById<LinearLayout>(resId);
        for (int i = 0; i < num; i++)
        {
            EditText et = new EditText(activity);
            et.Text = "test";
            et.LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
            container.AddView(et);
            oc.Add(et);
        }

        oc.CollectionChanged += Oc_CollectionChanged;
    }

    private void Oc_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            for (int i = 0; i < e.NewItems.Count; i++)
            {
                //add the view manually
                container.AddView((View)e.NewItems[i]);
            }
        }
    }
}

Main.axml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <LinearLayout
    android:orientation="vertical"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
  </LinearLayout>
  <Button
    android:id="@+id/btnAdd"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Add EditText"/>
</LinearLayout>