【问题标题】:Two way databinding with collection on Xamarin.Android/Android在 Xamarin.Android/Android 上使用集合的两种方式数据绑定
【发布时间】:2018-03-16 15:07:05
【问题描述】:

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

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

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

是否有任何更接近的方法可以将 axml/xml 视图与一个集合(可能是一个 Observable 集合,至少来自后面的代码)绑定,该集合将处理集合更改以及各个字段的更改,而无需我做所有事情这个手动。在某些情况下,我还必须显示图像。

另外,我尝试使用 ListView,但它并没有像我预期的那样工作。

【问题讨论】:

  • 如果您让我知道投反对票的原因,我可以对其进行编辑和修复。我尽量把问题陈述简明扼要地表达出来,让懂数据绑定的人都能看懂问题。谢谢!

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


【解决方案1】:

有没有更紧密的方法可以将 axml/xml 视图与一个集合(可能是一个 Observable 集合,至少来自后面的代码)绑定,该集合将处理集合更改以及单个字段的更改,而无需我做所有事情这个是手动的。

答案是否定的,没有。 Android 的视图在创建时必须绑定到特定的上下文/活动。它们不能被隔离,所以添加/删除EditTexts必须自己实现。

目前,最接近您要求的方法是创建一个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>

【讨论】:

  • 不错!比我已经完成的更简单的方法。非常感谢!
猜你喜欢
  • 2020-07-31
  • 2018-02-08
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多