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