lau*_*jpn 8 data-binding android mvvmcross xamarin android-recyclerview
我在我的Xamarin Android项目中使用MvvmCross.我有一个用,我已经在它的布局文件分配一个项目模板.MvxActivityMvxRecyclerView
<MvxRecyclerView
android:id="@+id/my_recycler_view"
local:MvxItemTemplate="@layout/item_recycler_view" />
Run Code Online (Sandbox Code Playgroud)
ViewModel非常简单,它只包含一个属性,用于保存要显示在以下内容中的数据RecyclerView:
public class MainViewModel : MvxViewModel
{
private IEnumerable<ViewModelItem> _viewModelItems;
public IEnumerable<ViewModelItem> ViewModelItems
{
get { return _viewModelItems; }
set { SetProperty(ref _viewModelItems, value); }
}
}
Run Code Online (Sandbox Code Playgroud)
通常,我喜欢尽可能多地使用MvvmCross流畅的API,因为隐式重构支持.所以在我的活动中,我绑定了这样的属性MvxRecyclerView:
var recyclerView = View.FindViewById<MvxRecyclerView>(Resource.Id.my_recycler_view);
var set = this.CreateBindingSet<MainView, MainViewModel>();
set.Bind(recyclerView)
.For(v => v.ItemsSource)
.To(vm => vm.ViewModelItems);
set.Apply();
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在,项目模板的布局文件基本上只包含TextView:
<LinearLayout>
<TextView
android:id="@+id/innerText" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的ViewModelItem班级看起来像这样:
public class ViewModelItem
{
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,如何以及在何处使用流畅的API TextView.Text将ViewModelItem.Title属性绑定到属性?
我知道通过MvxBind在项目模板布局文件中提供属性,没有流畅的API很容易,但我真的更喜欢流畅的API解决方案.
小智 15
继承自MvxRecyclerAdapter并为RecyclerView创建自定义适配器.覆盖OnCreateViewHolder并返回自定义ViewHolder.
public class MyAdapter : MvxRecyclerAdapter
{
public MyAdapter(IMvxAndroidBindingContext bindingContext)
: base(bindingContext)
{
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var itemBindingContext = new MvxAndroidBindingContext(parent.Context, this.BindingContext.LayoutInflaterHolder);
var view = this.InflateViewForHolder(parent, viewType, itemBindingContext);
return new MyViewHolder(view, itemBindingContext);
}
}
Run Code Online (Sandbox Code Playgroud)
在此ViewHolder中,您可以使用Fluent API进行绑定.
public class MyViewHolder : MvxRecyclerViewHolder
{
private readonly TextView textView;
public MyViewHolder(View itemView, IMvxAndroidBindingContext context)
: base(itemView, context)
{
this.textView = itemView.FindViewById<TextView>(Android.Resource.Id.Text1);
this.DelayBind(() =>
{
var set = this.CreateBindingSet<MyViewHolder, ViewModelItem>();
set.Bind(this.textView).To(x => x.Title);
set.Apply();
});
}
}
Run Code Online (Sandbox Code Playgroud)
在您的Activity中创建适配器并将其添加到RecyclerView:
var adapter = new MyAdapter((IMvxAndroidBindingContext)this.BindingContext);
recyclerView.Adapter = adapter;
Run Code Online (Sandbox Code Playgroud)
并将您的项目绑定到您的适配器的ItemsSource:
set.Bind(this.adapter).For(x => x.ItemsSource).To(x => x.ViewModelItems);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3776 次 |
| 最近记录: |