我目前正在开始使用Xamarin.Forms。我的页面上有一个ListView,它绑定到我的ViewModel。 ItemTemplate属于' ImageCell'
绑定单元格的Text和Detail属性没有问题。但是,我无法绑定' ImageSourceProperty'。这是使用byte []生成的imagesource(我的图像是SQLite数据库中的blob)
我想知道是否有人知道如何解决这个问题(或另一种方法将字节[] - 图像绑定到listview-item)
这里有一些源代码:
var model = Graanziekten.Select(g => new OnkruidViewModel
{
Id = g.Id, Naam = g.Naam, Omschrijving = g.Omschrijving, Afbeelding = g.BitmapThumbnail
}).ToList();
var cell = new DataTemplate(typeof(ImageCell));
cell.SetBinding(TextCell.TextProperty, "Naam");
cell.SetBinding(TextCell.DetailProperty, "Omschrijving");
cell.SetBinding(ImageCell.ImageSourceProperty, "Afbeelding");
var listview = new ListView
{
ItemsSource = model,
ItemTemplate = cell
};
' BitmapThumbnail'属性定义为:
public ImageSource BitmapThumbnail
{
get
{
//AfbeeldingSmall is a byte[]
return ImageSource.FromStream(() => new MemoryStream(Afbeeldingen.First().AfbeeldingSmall));
}
}
如果我使用虚拟图像(来自uri),它可以正常工作。但是,如果我使用上面显示的代码,内容页面甚至都不会呈现(空黑屏)。
起初我认为这个问题可能与从事件中动态获取byte []这一事实有关,但是当我获取所有必需的byte []时会出现同样的效果。
此外,当我将单个图像添加到我的内容页面时,使用相同的方法,它可以工作。只是不在列表视图中。
我试图在WinPhone8上做这个(虽然我不认为平台很重要)
提前致谢。
答案 0 :(得分:0)
您是否尝试过直接将其绑定到列表?而不是加载该模型对象。
var cell = new DataTemplate(typeof(ImageCell));
cell.SetBinding(ImageCell.ImageSourceProperty, "Afbeelding");
cell.SetBinding(TextCell.TextProperty, "Naam");
cell.SetBinding(TextCell.DetailProperty, "Omschrijving");
var listview = new ListView
{
ItemsSource = Graanziekten,
ItemTemplate = cell
};
您也可以将Image属性保留为:
public ImageSource BitmapThumbnail
{
get
{
return Afbeeldingen.First().AfbeeldingSmall;
}
}
并使用转换器:
public class ByteArrayToImageConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
byte[] imageAsBytes = (byte[])value;
return ImageSource.FromStream(() => new MemoryStream(imageAsBytes);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
如果您要使用转换器,则需要将SetBinding更改为:
cell.SetBinding(ImageCell.ImageSourceProperty, "Afbeelding", BindingMode.OneWay, new ByteArrayToImageConverter());
修改强>: 你的SetBinding(TextCell)应该是SetBinding(ImageCell)。 您还可以尝试像这样构建datatemplate吗?它不应该有所作为,但我没有想法:
var listview = new ListView
{
ItemsSource = Graanziekten,
ItemTemplate = new DataTemplate(() =>
{
ImageCell imageCell = new ImageCell();
imageCell.SetBinding(ImageCell.ImageSourceProperty, new Binding("Afbeelding", BindingMode.OneWay, new ByteArrayToImageConverter()));
imageCell.SetBinding(ImageCell.TextProperty, "Naam");
imageCell.SetBinding(ImageCell.DetailProperty, "Omschrijving");
return imageCell;
};
};
而不是
var listview = new ListView
{
ItemsSource = Graanziekten,
ItemTemplate = cell
};