此功能大约需要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;
}
有没有办法优化它?
答案 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);
}
}