Xamarin MVXAAdapter程序绑定

Xamarin MVXAAdapter程序绑定,xamarin,mvvmcross,Xamarin,Mvvmcross,我有一个自定义MVXAAdapter,它绑定到一个自定义对象列表。 我希望在自定义适配器中以编程方式将对象绑定到android资源,而不是在xml中指定绑定 我理解这是可能的,因为Stuart回答了一个关于SO的问题,他说“……在自定义适配器中应用绑定,并在活动中的OnCreate中设置该适配器” 但是,我找不到任何此类示例,并且CreateBindingSet()在GetView或GetBindableView中不可用 谁能给我指出正确的方向吗 编辑:添加代码以说明我希望在何处手动执行绑定

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

我理解这是可能的,因为Stuart回答了一个关于SO的问题,他说“……在自定义适配器中应用绑定,并在活动中的OnCreate中设置该适配器”

但是,我找不到任何此类示例,并且CreateBindingSet()在GetView或GetBindableView中不可用

谁能给我指出正确的方向吗

编辑:添加代码以说明我希望在何处手动执行绑定

        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;
        }
protectedoverride视图GetBindableView(视图转换视图,对象源,int-templateId)
{
if(源是带有选项卡VIEWMODEL.PictureFeature的作业)
templateId=Resource.Layout.jobview_带选项卡_功能_项目_图片;
else if(源是JobWithTabViewModel.PointOfInterestFeature的作业)
templateId=Resource.Layout.jobview\带有选项卡\功能\项目\ poi;
返回base.GetBindableView(convertView、source、templateId);
}
受保护的覆盖视图GetView(int位置、视图转换视图、视图组父视图、int模板ID)
{
var theView=base.GetView(位置、转换视图、父级、模板ID);
var项目=GetRawItem(位置);
if(项为JobWithTabsViewModel.PointOfInterestFeature的作业)
{
if(theView!=null)
{
var iv=view.findviewbyd(Resource.Id.card\u缩略图\u图像);
//从这里手动绑定
}
其他的
{
theView=GetBindableView(convertView、item、templateId);
//从这里手动绑定
}
}
返回视图;
}

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

设置适配器时,请执行以下操作:

var listView = FindViewById<MvxListView>(Resource.Id.listView);
var adapter = new MyAdapter(..);
listView.Adapter = adapter;
var listView=findviewbyd(Resource.Id.listView);
var适配器=新的MyAdapter(..);
Adapter=适配器;

以下是我如何解决适配器内绑定的问题,以供将来参考:

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

如果将convertView强制转换为此,则可以使用诸如CreateBinding之类的绑定方法

然后可以为ConvertView中的任何视图创建绑定,但是如果ConvertView=null以确保在重复使用列表项时引用数据。我的要求是仅在源为特定类型时绑定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;
}
protectedoverride视图GetBindableView(视图转换视图,对象源,int-templateId)
{
if(convertView==null)
{
convertView=base.GetBindableView(convertView,source,templateId);
if(源是带有选项卡VIEWMODEL.PictureFeature的作业)
{
var imageView=convertView.findviewbyd(Resource.Id.card\u缩略图\u图像);
var owner=convertView作为IMvxBindingContextOwner;
owner.CreateBinding(imageView).For(“位图”).To(“TheRawImageBytes”).with转换(“InMemoryImage”).Apply();
}
}
其他的
{
BindableView(源代码,转换视图为IMvxListItemView);
}
返回视图;
}

谢谢cheesebaron,我用一些代码更新了我的问题。我已经添加了引用(我使用的是VS2013),但仍然无法看到我认为应该使用它的CreateBindingSet。我已经有了自定义适配器来处理列表。我还添加了与我的问题相关的[this post]()。