MvxAdapter 程序化绑定
MvxAdapter Programmatic Binding
我有一个绑定到自定义对象列表的自定义 MvxAdapter。
我想在自定义适配器中以编程方式将我的对象绑定到我的 android 资源,而不是在 xml.
中指定我的绑定
我知道这是可能的,因为 Stuart 在 SO here 上回答了一个问题,他在其中指出“......在自定义适配器中应用绑定并通过在你的 [=23] 中的 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;
}
CreateBindingSet
位于命名空间 Cirrious.MvvmCross.Binding.BindingContext
中。您的 IDE 可能很难找到它的原因是因为它是一种扩展方法。
适配器设置完成:
var listView = FindViewById<MvxListView>(Resource.Id.listView);
var adapter = new MyAdapter(..);
listView.Adapter = adapter;
为了将来参考,这是我处理适配器内绑定的方式:
convertView 是一个 IMvxBindingContextOwner,在 base.GetBindableView() 中设置。
如果将 convertView 转换为 this,则可以使用 CreateBinding 等绑定方法。
然后您可以在 ConvertView 中为任何视图创建绑定,但如果 convertView!=null,我还必须调用 BindBindableView() 以确保在重新使用列表项时引用数据。我的要求是仅在源为特定类型时绑定图像视图。
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;
}
我有一个绑定到自定义对象列表的自定义 MvxAdapter。 我想在自定义适配器中以编程方式将我的对象绑定到我的 android 资源,而不是在 xml.
中指定我的绑定我知道这是可能的,因为 Stuart 在 SO here 上回答了一个问题,他在其中指出“......在自定义适配器中应用绑定并通过在你的 [=23] 中的 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;
}
CreateBindingSet
位于命名空间 Cirrious.MvvmCross.Binding.BindingContext
中。您的 IDE 可能很难找到它的原因是因为它是一种扩展方法。
适配器设置完成:
var listView = FindViewById<MvxListView>(Resource.Id.listView);
var adapter = new MyAdapter(..);
listView.Adapter = adapter;
为了将来参考,这是我处理适配器内绑定的方式:
convertView 是一个 IMvxBindingContextOwner,在 base.GetBindableView() 中设置。
如果将 convertView 转换为 this,则可以使用 CreateBinding 等绑定方法。
然后您可以在 ConvertView 中为任何视图创建绑定,但如果 convertView!=null,我还必须调用 BindBindableView() 以确保在重新使用列表项时引用数据。我的要求是仅在源为特定类型时绑定图像视图。
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;
}