You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:30:35