在Xamarin.Android/Android上使用集合进行双向数据绑定
我有一个包含一些EditText的UI,这组EditText可以根据列表中的项目数重复多次(不太多,最多3-10次) 用户可以编辑/修改/删除项目或编辑编辑文本的值。目前,我正在使用“AddView/RemoveView”手动执行此操作,手动处理状态等,但这是一项大量工作,因为我有许多类似的场景 我们有一个具有相同功能的web应用程序,我们正在使用AngularJS来处理所有这些,正如您所知,这非常简单 是否有更接近的方法将axml/xml视图与集合(可能是可观察的集合,至少是来自代码隐藏)绑定,该集合将负责集合更改以及单个字段更改,而无需我手动执行所有这些操作。在某些情况下,我还必须显示图像 另外,我尝试使用ListView,但是它并没有像我期望的那样工作 是否有更接近的方法将axml/xml视图与集合(可能是可观察的集合,至少是来自代码隐藏)绑定,该集合将负责集合更改以及单个字段更改,而无需我手动执行所有这些操作 答案是没有。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
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>
如果你让我知道投反对票的原因,我可以编辑并修正。我尽我所能简洁地表达问题陈述,以便任何了解数据绑定的人都能理解这个问题。谢谢美好的比我已经做的简单一点。非常感谢!