MvxAdapter程序绑定

时间:2015-03-11 11:30:50

标签: xamarin mvvmcross

我有一个自定义MvxAdapter绑定到自定义对象列表。 我想在自定义适配器中以编程方式将我的对象绑定到我的android资源,而不是在xml中指定我的绑定。

我明白这是可能的,因为斯图尔特在SO here上回答了一个问题,他指出了#34; ....在自定义适配器中应用绑定,并在Activity"中的OnCreate中设置该适配器。

但是,我找不到任何这样的示例,并且GetView或GetBindableView中没有CreateBindingSet()。

有人能指出我正确的方向吗?

编辑:添加代码以说明我想手动执行绑定的位置

        protected override View GetBindableView(View convertView, object source, int templateId)
        {
            if (source is JobWithTabsViewModel.PictureFeature)
                templateId = Resource.Layout.jobview_withtabs_features_item_picture;
            else if (source is JobWithTabsViewModel.PointOfInterestFeature)
                templateId = Resource.Layout.jobview_withtabs_features_item_poi;
            return base.GetBindableView(convertView, source, templateId);
        }

        protected override View GetView(int position, View convertView, ViewGroup parent, int templateId)
        {

            var theView = base.GetView(position, convertView, parent, templateId);

            var item = GetRawItem(position);

            if (item is JobWithTabsViewModel.PointOfInterestFeature)
            {
                if (theView != null)
                {
                    var iv = theView.FindViewById<ImageView>(Resource.Id.card_thumbnail_image);
                    // Manually Bind From Here
                }
                else
                {
                    theView = GetBindableView(convertView, item, templateId);
                    // Manually Bind From Here
                }
            }
            return theView;
        }

2 个答案:

答案 0 :(得分:4)

为了将来参考,这就是我在适配器中处理绑定的方式:

convertView是一个IMvxBindingContextOwner,在base.GetBindableView()中设置。

如果将convertView强制转换为此,则可以使用绑定方法,例如CreateBinding。

然后,您可以为ConvertView中的任何视图创建绑定,但如果convertView!= null,我还必须调用BindBindableView()以确保在重新使用列表项时重新调用数据。我的要求是当源是特定类型时才绑定imageview。

protected override View GetBindableView(View convertView, object source, int templateId)
{
    if (convertView == null)
    {
        convertView = base.GetBindableView(convertView, source, templateId);

        if (source is JobWithTabsViewModel.PictureFeature)
        {
            var imageView = convertView.FindViewById<MvxImageView>(Resource.Id.card_thumbnail_image);

            var owner = convertView as IMvxBindingContextOwner;
            owner.CreateBinding(imageView).For("Bitmap").To("TheRawImageBytes").WithConversion("InMemoryImage").Apply();
        }
    }
    else
    {
        BindBindableView(source, convertView as IMvxListItemView);
    }

    return convertView;
}

答案 1 :(得分:1)

CreateBindingSet位于名称空间Cirrious.MvvmCross.Binding.BindingContext中。您的IDE可能很难找到它的原因是因为它是一种扩展方法。

使用以下命令设置适配器:

var listView = FindViewById<MvxListView>(Resource.Id.listView);
var adapter = new MyAdapter(..);
listView.Adapter = adapter;