xamarin.forms将listview-imagecell imagesource绑定到byte []

时间:2014-08-04 10:46:17

标签: c# windows xamarin cross-platform xamarin.forms

我目前正在开始使用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上做这个(虽然我不认为平台很重要)

提前致谢。

1 个答案:

答案 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
};