Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xamarin.Android/Android上使用集合进行双向数据绑定_Android_Mvvm_Data Binding_Xamarin.android_Mvvm Light - Fatal编程技术网

在Xamarin.Android/Android上使用集合进行双向数据绑定

在Xamarin.Android/Android上使用集合进行双向数据绑定,android,mvvm,data-binding,xamarin.android,mvvm-light,Android,Mvvm,Data Binding,Xamarin.android,Mvvm Light,我有一个包含一些EditText的UI,这组EditText可以根据列表中的项目数重复多次(不太多,最多3-10次) 用户可以编辑/修改/删除项目或编辑编辑文本的值。目前,我正在使用“AddView/RemoveView”手动执行此操作,手动处理状态等,但这是一项大量工作,因为我有许多类似的场景 我们有一个具有相同功能的web应用程序,我们正在使用AngularJS来处理所有这些,正如您所知,这非常简单 是否有更接近的方法将axml/xml视图与集合(可能是可观察的集合,至少是来自代码隐藏)绑定

我有一个包含一些EditText的UI,这组EditText可以根据列表中的项目数重复多次(不太多,最多3-10次)

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

我们有一个具有相同功能的web应用程序,我们正在使用AngularJS来处理所有这些,正如您所知,这非常简单

是否有更接近的方法将axml/xml视图与集合(可能是可观察的集合,至少是来自代码隐藏)绑定,该集合将负责集合更改以及单个字段更改,而无需我手动执行所有这些操作。在某些情况下,我还必须显示图像

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

是否有更接近的方法将axml/xml视图与集合(可能是可观察的集合,至少是来自代码隐藏)绑定,该集合将负责集合更改以及单个字段更改,而无需我手动执行所有这些操作

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

目前,与您的需求最接近的方法是创建一个
observateCollection
并侦听
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]);
            }
        }
    }
}
[活动(Label=“Demo”,MainLauncher=true)]
公共课活动:活动
{
按钮btnAdd;
可观察收集oc;
线性布局集装箱;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//从“主”布局资源设置视图
SetContentView(Resource.Layout.Main);
btnAdd=findviewbyd(Resource.Id.btnAdd);
btnAdd.Click+=btnAdd\u Click;
GenerateET(Resource.Id.container,this,3);
}
私有void BtnAdd_单击(对象发送者,System.EventArgs e)
{
EditText et=新的EditText(本);
et.Text=“测试”;
et.LayoutParameters=新建ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent,ViewGroup.LayoutParams.WrapContent);
oc.Add(et);
}
public void GenerateET(int resId,Activity Activity,int num)
{
//创建一个可观察的集合
oc=新的ObservableCollection();
容器=activity.FindViewById(resId);
for(int i=0;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>


如果你让我知道投反对票的原因,我可以编辑并修正。我尽我所能简洁地表达问题陈述,以便任何了解数据绑定的人都能理解这个问题。谢谢美好的比我已经做的简单一点。非常感谢!