UWP中索引List导致访问ComboBox时抛出System.ArgumentOutOfRangeException
访问List元素导致无关UI操作抛出ArgumentOutOfRangeException
你的问题核心是SelectionChanged中访问activePeople[0].ID的操作,会间接导致RemovePersonClick里的UI操作抛出越界异常,根源大概率是事件触发顺序和集合状态不一致,或者隐式的异常传播干扰了后续操作。
具体逻辑链:
- 当你在
RemovePersonClick中先移除activePeople的元素,再设置ComboBox.SelectedIndex = 0时,会触发SelectionChanged事件再次执行。此时activePeople已经被移除了一项,如果原本activePeople只有1个元素,现在就为空集合,访问activePeople[0]会抛出ArgumentOutOfRangeException。 - WPF会捕获这个异常,但会打乱后续UI操作的正常流程,导致原本合法的
peopleBox.RemoveAt(selectedPersonIndex)或ComboBox.SelectedIndex = 0也抛出异常(看似索引越界,实际是异常传播导致的状态混乱)。 - 另外也有可能
activePeople[0]本身是null,访问ID时抛出NullReferenceException,同样会干扰后续操作。
解决方案
方案1:调整操作顺序,避免触发SelectionChanged时集合已修改
先修改ComboBox绑定的集合和选中状态,再处理activePeople,避免触发SelectionChanged时集合已经被修改:
private void RemovePersonClick(object sender, RoutedEventArgs e) { int selectedPersonIndex = ComboBox.SelectedIndex; if(selectedPersonIndex < 1) return; // 先移除ComboBox绑定的集合项,再设置选中状态,最后处理activePeople peopleBox.RemoveAt(selectedPersonIndex); ComboBox.SelectedIndex = 0; activePeople.RemoveAt(selectedPersonIndex - 1); }
方案2:临时取消SelectionChanged事件订阅
在修改ComboBox.SelectedIndex时,暂时取消事件订阅,避免触发SelectionChanged访问已修改的activePeople:
private void RemovePersonClick(object sender, RoutedEventArgs e) { int selectedPersonIndex = ComboBox.SelectedIndex; if(selectedPersonIndex < 1) return; activePeople.RemoveAt(selectedPersonIndex - 1); // 临时取消事件订阅 ComboBox.SelectionChanged -= SelectionChanged; ComboBox.SelectedIndex = 0; // 重新订阅事件 ComboBox.SelectionChanged += SelectionChanged; peopleBox.RemoveAt(selectedPersonIndex); }
方案3:添加安全检查,从根源避免SelectionChanged抛出异常
在SelectionChanged中添加严格的空值和数量检查,确保访问activePeople[0].ID时不会抛出异常:
private void SelectionChanged(object sender, SelectionChangedEventArgs e) { // 添加安全检查,避免空集合或null元素导致异常 if (activePeople.Count > 0 && activePeople[0] != null) { string ID = activePeople[0].ID; } }
额外建议
- 确保
activePeople的所有增删操作都在UI线程执行(WPF集合操作必须在UI线程,否则会导致状态不一致)。 - 如果
activePeople需要绑定到UI控件,建议改用ObservableCollection<Person>替代List<Person>,以便集合变化时自动通知UI更新。
内容的提问来源于stack exchange,提问作者JRH3221
相关产品推荐
相关产品推荐

