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

时间:2016-03-29 11:02:02

标签: data-binding xamarin xamarin.ios mvvm-light

我使用Xamarin.iOS和mvvmlight构建跨平台解决方案作为mvvm框架。

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

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

Listview

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

<ListView ItemsSource="{Binding NewsList}" > 模型的image属性在设置时引发属性更改事件。

图像源绑定在xaml中的NewsItem

中创建
ListView.ItemTemplate

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

然而,当尝试在Xamarin.iOS中设置此绑定时,我遇到了问题。 按照iOS绑定的示例,我使用<ListView.ItemTemplate> <DataTemplate> ... <Image Source="{Binding Image}" /> 上的GetController函数:

ObservableCollection

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

BindNewsCell

此绑定不起作用。我也尝试过使用:

private void BindNewsCell(UITableViewCell cell, NewsItem news, NSIndexPath path)
{
    // Reference for UI elements in cell
    var titleLabel = cell.ViewWithTag (100) as UILabel;
    var dateLabel = cell.ViewWithTag (101) as UILabel;
    var imageView = cell.ViewWithTag (102) as UIImageView;

    // Set values in cell
    titleLabel.Text = news.Title;
    dateLabel.Text = news.Date;

    // The line commented out below works in setting the image, but does not update
    // when the image property changes, only when the cells are redrawn. 
    //imageView.Image = ValueConverter.IBitmapToUIImage(news.Image);

    this.SetBinding (
            () => news.Image,
            () => imageView.Image)
            .ConvertSourceToTarget(ValueConverter.IBitmapToUIImage);
}

没有成功。

我可以做常规装订:

this.SetBinding(
    () => news.Image)
    .WhenSourceChanges(
        () =>
        {
            imageView.Image = ValueConverter.IBitmapToUIImage(news.Image);            
        });

工作正常。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

imageView.Image = UIImage.FromBundle(news.Image);

您的图片必须:

  • 存储在iOS项目的Resources
  • 拥有构建操作BundleResource
  • 如果xyz.png是“xyz”,则名称为news.Image(jpg,bmp,...正在运作)