提高ListBox.SelectedItems.Add的速度

时间:2014-06-12 18:53:03

标签: wpf

此功能大约需要3秒钟重新选择ListBox中的2500个项目(foreach需要相同的时间)并在其中阻止用户界面:

private void ReselectFiles(List<FileData> sel)
{           
  FilesListBox.SelectionChanged -= FilesListBox_SelectionChanged;
  for (int i = 0; i < sel.Count; i++)
       FilesListBox.SelectedItems.Add(sel[i]);    
  FilesListBox.SelectionChanged += FilesListBox_SelectionChanged;           
}

有没有办法优化它?

1 个答案:

答案 0 :(得分:0)

没有FilesListBox实际上的细节,很难说,但我假设所选项目绑定到一个可观察的集合?

如果是这样,那么每次添加一个项目时,它都会引发一个集合更改事件,该事件将重新生成列表中的项目。

最好从ObservableCollection派生并添加某种AddRange方法 - 阻止OnCollectionChanged被调用,直到你完成添加项目为止。

一个例子:

public class ObservableCollectionEx : ObservableCollection
{
    public void AddRange(IEnumerable<T> list)
    {
        foreach (T item in list)
        {
            this.Items.Add(item);
        }

        this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void ClearAndAddRange(IEnumerable<T> list)
    {
        this.Items.Clear();

        this.AddRange(list);
    }
}