如何使用MvvmCross流畅的API将RecyclerView项目的TextView绑定到Android上ViewModel的属性?

如何使用MvvmCross流畅的API将RecyclerView项目的TextView绑定到Android上ViewModel的属性?,第1张

概述我在我的Xamarin Android项目中使用MvvmCross.我有一个MvxActivity与MvxRecyclerView,我已在其布局文件中分配了一个项目模板. <MvxRecyclerView android:id="@+id/my_recycler_view" local:MvxItemTemplate="@layout/item_recycler_view" /> 我在我的Xamarin Android项目中使用MvvmCross.我有一个MvxActivity与MvxRecyclerVIEw,我已在其布局文件中分配了一个项目模板.
<MvxRecyclerVIEw    androID:ID="@+ID/my_recycler_vIEw"    local:MvxItemTemplate="@layout/item_recycler_vIEw" />

viewmodel非常简单,它只包含一个属性,用于保存要在RecyclerVIEw中显示的数据:

public class Mainviewmodel : Mvxviewmodel{    private IEnumerable<viewmodelitem> _viewmodelitems;    public IEnumerable<viewmodelitem> viewmodelitems    {        get { return _viewmodelitems; }        set { SetProperty(ref _viewmodelitems,value); }    }    }

通常,我喜欢尽可能多地使用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();

到现在为止还挺好.现在,项模板的布局文件基本上只包含一个TextVIEw:

<linearLayout>    <TextVIEw        androID:ID="@+ID/innerText" /></linearLayout>

我的viewmodelitem类看起来像这样:

public class viewmodelitem{    public string Title { get; set; }}

我现在的问题是,如何以及在何处使用流畅的API将TextVIEw.Text属性绑定到viewmodelitem.Title属性?

我知道通过在项目模板布局文件中提供MvxBind属性,没有流畅的API很容易,但我真的更喜欢流畅的API解决方案.

解决方法 继承自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);    }}

在此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();        });    }}

在您的Activity中创建适配器并将其添加到RecyclerVIEw:

var adapter = new MyAdapter((IMvxAndroIDBindingContext)this.BindingContext);recyclerVIEw.Adapter = adapter;

并将您的项目绑定到您的适配器的ItemsSource:

set.Bind(this.adapter).For(x => x.ItemsSource).To(x => x.viewmodelitems);
总结

以上是内存溢出为你收集整理的如何使用MvvmCross流畅的API将RecyclerView项目的TextView绑定到Android上ViewModel的属性?全部内容,希望文章能够帮你解决如何使用MvvmCross流畅的API将RecyclerView项目的TextView绑定到Android上ViewModel的属性?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1134392.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存