将图像和文本绑定到列表框会得到超出范围的异常索引
本文关键字:范围 索引 异常 图像 文本 绑定 列表 | 更新日期: 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
前缀。