Data binding Mvvmlight,Xamarin.iOS在ObservableCollection项中嵌套绑定

Data binding Mvvmlight,Xamarin.iOS在ObservableCollection项中嵌套绑定,data-binding,xamarin,xamarin.ios,mvvm-light,Data Binding,Xamarin,Xamarin.ios,Mvvm Light,我正在使用Xamarin.iOS和mvvmlight作为mvvm框架构建一个跨平台的解决方案 我遇到了嵌套绑定的问题。我试图在Xamarin.iOS中完成以下windows phone示例: 我有一个名为NewsList的类型为NewsItem的可观察集合,我绑定到Listview 此列表最初由具有空图像的新闻项填充。在加载图像时,每个项目都会更新其图像属性 NewsItem模型的image属性在设置时引发属性更改事件 图像源绑定在xaml中的ListView.ItemTemplate中创建

我正在使用Xamarin.iOS和mvvmlight作为mvvm框架构建一个跨平台的解决方案

我遇到了嵌套绑定的问题。我试图在Xamarin.iOS中完成以下windows phone示例:

我有一个名为
NewsList
的类型为
NewsItem
的可观察集合,我绑定到
Listview


此列表最初由具有空图像的新闻项填充。在加载图像时,每个项目都会更新其图像属性

NewsItem
模型的image属性在设置时引发属性更改事件

图像源绑定在xaml中的
ListView.ItemTemplate
中创建:


...
此绑定适用于Windows Phone。图像在集合填充时最初更新,而图像在加载时更新

但是,当尝试在Xamarin.iOS中设置此绑定时,我遇到了一些问题。 按照给出的iOS绑定示例,我在
ObservableCollection
上使用
GetController
函数:

newsTableViewController=NewsListHolder.GetController(CreateNewsCell,BindNewsCell);
BindNewsCell
中,我尝试设置图像绑定,就像上面的windows phone示例一样。然而,事实证明这很困难:

private void BindNewsCell(UITableViewCell单元格、新闻项新闻、nsindepath路径)
{
//单元格中UI元素的引用
var titleLabel=cell.ViewWithTag(100)作为UILabel;
var dateLabel=cell.ViewWithTag(101)作为UILabel;
var imageView=cell.ViewWithTag(102)作为UIImageView;
//在单元格中设置值
titleLabel.Text=news.Title;
dateLabel.Text=news.Date;
//下面注释掉的行用于设置图像,但不会更新
//当图像属性更改时,仅当重新绘制单元格时。
//imageView.Image=ValueConverter.IBitmapToUIImage(news.Image);
这是挫折(
()=>新闻,图像,
()=>imageView.Image)
.ConvertSourceToTarget(ValueConverter.IBitmapToUIImage);
}
这个绑定不起作用。我还尝试使用:

this.SetBinding(
()=>news.Image)
.当资源发生变化时(
() =>
{
imageView.Image=ValueConverter.IBitmapToUIImage(news.Image);
});
没有成功

我可以做常规装订:

私有绑定testBinding;
//设置测试绑定
testBinding=this.SetBinding(
()=>Vm.Test,
()=>TestIndicator.Hidden));
很好

如何绑定到可观察集合中动态创建的项中的属性

编辑:我修改了过度简化的上述代码示例,以包含更多关于图像转换的细节。


将问题归结为:在xamarin.ios中使用mvvmlight,我如何在所述项目的可观察列表中的项目的特定属性上实现数据绑定?

我假设,
newsitem.Image
是一个字符串,因为它来自通常不包含平台特定类型的ViewModel。因此,您试图将字符串分配给
UIImage
。您需要加载此名称的图像

imageView.Image=UIImage.FromBundle(news.Image);
您的图像必须:

  • 存储在iOS项目的
    资源中
  • 让构建操作
    BundleResource
  • 如果
    news.Image
    是“xyz”(jpg、bmp等也在工作),则名称为
    xyz.png

您可以这样假设。在试图简化代码时,我似乎有点太模糊了。在我的具体实现中,我结合使用框架和值转换器来实现跨平台图像加载。我编辑了问题中的代码,以更好地反映图像转换。