MvxListView从代码创建模板布局的绑定

Ser*_*que 10 android xamarin.android mvvmcross

让我说我有一个简单的布局与MvxListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/LiivControl.Client.Droid"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Mvx.MvxListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        local:MvxBind="ItemsSource AutoListItems; ItemClick AutoListItemClicked"
        local:MvxItemTemplate="@layout/vbmvxautoviewlistitem" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我的项目模板布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/LiivControl.Client.Droid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="10dip"
    android:paddingBottom="10dip"
    android:paddingLeft="15dip">
    <TextView
        android:id="@+id/list_complex_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <TextView
        android:id="@+id/list_complex_caption"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我想从代码隐藏中为itemtemplate中的两个textview元素指定绑定.我不确定如何最好地去做.我猜我可以在MvxListView后面的视图代码中做一些"OnViewModelSet".我尝试过以下但是因为它无法找到控件而显然无效.

protected override void OnViewModelSet()
    {
        IVbMvxAutoListViewModel vm = base.ViewModel as IVbMvxAutoListViewModel;

        TextView title = this.FindViewById<TextView>(Resource.Id.list_complex_title);
        this.CreateBinding(title).For(x => x.Text).To(vm.ListItemDescriptor.TitlePropName).Apply();

        TextView subTitle = this.FindViewById<TextView>(Resource.Id.list_complex_caption);
        this.CreateBinding(subTitle).For(x => x.Text).To(vm.ListItemDescriptor.SubTitlePropName).Apply();
        base.OnViewModelSet();
    }
Run Code Online (Sandbox Code Playgroud)

我的另一个想法是以某种方式拦截itemtemplate视图的oncreate,但如果我为itemtemplate布局创建一个视图代码文件,则不会调用OnCreate.

Stu*_*art 16

要在代码中进行绑定,最好是:

  1. 实现自定义 MvxListViewItem
  2. 实现自定义MvxAdapter以返回自定义列表视图项
  3. 实现自定义MvxListView以使用自定义MvxAdapter

没有经过测试,但代码大致如下:

1.实现自定义 MvxListViewItem

public class CustomListItemView
    : MvxListItemView
{
    public MvxListItemView(Context context,
                           IMvxLayoutInflater layoutInflater,
                           object dataContext,
                           int templateId)
        : base(context, layoutInflater, dataContext, templateId)
    {
        var control = this.FindViewById<TextView>(Resource.Id.list_complex_title);
        var set = this.CreateBindingSet<CustomListViewItem, YourThing>();
        set.Bind(control).To(vm => vm.Title);
        set.Apply();
    }
}
Run Code Online (Sandbox Code Playgroud)

2.创建自定义 MvxAdapter

在这个覆盖 CreateBindableView

public class CustomAdapter
    : MvxAdapter
{
    public CustomAdapter(Context context)
        : base(context)
    {
    }

    protected override IMvxListItemView CreateBindableView(object dataContext, int templateId)
    {
        return new CustomListItemView(_context, _bindingContext.LayoutInflater, dataContext, templateId);
    }
}
Run Code Online (Sandbox Code Playgroud)

原文:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxAdapter.cs#L298

3.实现自定义MvxListView以使用适配器

这应该很简单:

public class CustomListView
    : MvxListView
{
    public CustomListView(Context context, IAttributeSet attrs)
        : base(context, attrs, new CustomAdapter(context))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

只要这是在您的主UI组件中,这应该在您的axml中可用:

<CustomListView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="ItemsSource AutoListItems; ItemClick AutoListItemClicked"
    local:MvxItemTemplate="@layout/vbmvxautoviewlistitem" />
Run Code Online (Sandbox Code Playgroud)

如果CustomListView不是在你的主UI组件,然后有一些技巧,以获得MvvmCross期间把它捡起来的Setup-看到提供了定制的Android视图组件https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App -和-安装#维基提供定制的视图,机器人


以上是最好的方法(IMO) - 但如果你想,那么只需在自定义适配器中应用绑定并OnCreate在你的设置中设置适配器就可以用更少的代码完成它Activity

  • 我的天啊!您真棒!这正是我想要的.我无法相信你回答我的问题的速度有多快.再次感谢! (2认同)