这是我的代码(它在WPF ListView中搜索所有匹配项并选择它们):
public bool FindAll(LogFilter filter, bool matchCase)
{
lastLogFilter = filter;
lastMatchCase = matchCase;
MatchSearcher quickSearchSearcher = new MatchSearcher(filter, !matchCase);
bool foundOnce = false;
Stopwatch watch = new Stopwatch();
watch.Start();
var query = from x in listView.Items.Cast<LogRecord>() where quickSearchSearcher.IsMatch(x, false) select x;
watch.Stop();
Console.WriteLine("Elapsed milliseconds to search: {0}.", watch.ElapsedMilliseconds);
if (query.Count() > 0)
{
foundOnce = true;
listView.SelectedItems.Clear();
watch.Restart();
foreach (LogRecord record in query)
{
listView.SelectedItems.Add(record);
}
watch.Stop();
Console.WriteLine("Elapsed milliseconds to select: {0}.", watch.ElapsedMilliseconds);
listView.ScrollIntoView(query.First());
}
return foundOnce;
}
以下是10,000个ListView项目的结果:
Elapsed milliseconds to search: 0.
Elapsed milliseconds to select: 36385.
所以,很明显我的问题在于循环:
foreach (LogRecord record in query)
{
listView.SelectedItems.Add(record);
}
我觉得应该有更好的方法来添加到所选项目列表中,或者至少在所有选定项目被设置之前,阻止数据模板更新(或类似的东西)在列表上。在WPF ListView中尝试以编程方式选择多个项时,有没有办法获得更好的性能?