我使用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,如何在所述项目的可观察列表中的项目的特定属性上实现数据绑定?
答案 0 :(得分:0)
我假设newsitem.Image
是一个字符串,因为它来自ViewModel,它通常不包含特定于平台的类型。因此,您尝试将字符串分配给UIImage
。您需要加载此名称的图像。
imageView.Image = UIImage.FromBundle(news.Image);
您的图片必须:
Resources
BundleResource
xyz.png
是“xyz”,则名称为news.Image
(jpg,bmp,...正在运作)