将图像和文本绑定到列表框会得到超出范围的异常索引

本文关键字:范围 索引 异常 图像 文本 绑定 列表 | 更新日期: 2023-09-27 18:33:07

我有列表框,我在其中绑定图像+文本。当我添加 15 个项目时没有问题,但是当我添加更多项目 20 和更多时,我得到 System.IndexOutOfRangeException。我发现列表框只能存储32kb,所以我尝试使用listview,我得到了相同的System.IndexOutOfRangeException。我使用ObservableCollection可能会在这里溢出,或者任何人都知道为什么我得到System.IndexOutOfRangeException?当项目添加到列表框时,我收到此异常。

    private ObservableCollection<BindingData> _rsMessages = new ObservableCollection<BindingData>();
    public ObservableCollection<BindingData> RSMessages
    {
        get { return _rsMessages; }
        set { _rsMessages = value; }
    }
public void initializeListboxRS()
    {
        foreach (var items in UniDB.returnListOfRSItems())
        {
            _rsMessages.Add(new BindingData
            {
                rssMessageText = items.tile,
                rssMessageDateTime = items.dateTime.ToString("dd.MM.yyyy - hh:mm"),
                rssMessageImage = ByteArrayToBitmapImage(items.image),
                rssMessageLink = items.link
            });
            OnPropertyChanged("RSMessages");
        }
    }

 private BitmapImage ByteArrayToBitmapImage(byte[] byteArray)
    {
        BitmapImage bitmapImage = new BitmapImage();
        InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
        ms.WriteAsync(byteArray.AsBuffer());  //exception here
        ms.FlushAsync().AsTask().Wait();
        ms.Seek(0);
        bitmapImage.SetSource(ms);
        return bitmapImage;
    }

将图像和文本绑定到列表框会得到超出范围的异常索引

您的方法实现缺少await关键字。请尝试以下代码。

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
{
    var bitmapImage = new BitmapImage();
    var stream = new InMemoryRandomAccessStream();
    await stream.WriteAsync(byteArray.AsBuffer());
    stream.Seek(0);
    bitmapImage.SetSource(stream);
    return bitmapImage;
}
private ObservableCollection<BindingData> _rsMessages = new ObservableCollection<BindingData>();
public ObservableCollection<BindingData> RSMessages
{
    get { return _rsMessages; }
    set { _rsMessages = value; }
}
public async Task initializeListboxRS()
{
    foreach (var items in UniDB.returnListOfRSItems())
    {
        _rsMessages.Add(new BindingData
        {
            rssMessageText = items.tile,
            rssMessageDateTime = items.dateTime.ToString("dd.MM.yyyy - hh:mm"),
            rssMessageImage = await ByteArrayToBitmapImage(items.image),
            rssMessageLink = items.link
        });
        OnPropertyChanged("RSMessages");
    }
}

无论何时调用方法initializeListboxRS()都使用await前缀。