点击DisplayAlert的OK按钮清除CollectionView选中项时遇索引越界错误
解决CollectionView清除选中项时的索引越界问题
错误原因
当调用collectionView.SelectedItems.Clear()清空选中项时,CollectionView会再次触发SelectionChanged事件。此时e.CurrentSelection是空集合,代码中直接访问e.CurrentSelection[0]就会抛出索引超出范围的异常。
修复方案
在处理SelectionChanged事件时,先判断e.CurrentSelection是否包含元素,避免空集合的索引访问操作。同时保留类型转换的空值判断,确保代码安全。
修改后的完整代码
private async void collectionView_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 空选中集合直接返回,避免索引越界 if (e.CurrentSelection.Count == 0) return; var itemSelected = e.CurrentSelection[0] as regci; // 类型转换失败也直接返回 if (itemSelected == null) return; var res = await DisplayAlert($"{itemSelected.Cliente} - {itemSelected.Equipo}", $"\nRpm del motor: {itemSelected.Motor} rpm\n\n" + $"Diámetro de polea motriz: {itemSelected.Motriz} in\n\n" + $"Diámetro de polea conducida: {itemSelected.Condu} in\n\n" + $"Amplitud: {itemSelected.Amp} in\n\n" + $"Frecuencia del sistema: {itemSelected.Frec} rpm\n\n" + $"Fuerza G: {itemSelected.FG}\n", "OK", "-"); if (res) { collectionView.SelectedItems.Clear(); } }
额外优化说明
- 简化了字符串拼接逻辑,去掉了冗余的
{"-"}这类写法,让代码更易读。 - 增加的两层判断确保了事件处理过程中的所有边界情况都被覆盖,不会再出现索引越界的问题。
内容的提问来源于stack exchange,提问作者Jaime Edmundo Silva Magallanes
相关产品推荐
相关产品推荐

