Ale*_*dru 1 .net c# wpf listview
这是我的代码(它在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;
}
Run Code Online (Sandbox Code Playgroud)
以下是10,000个ListView项目的结果:
Elapsed milliseconds to search: 0.
Elapsed milliseconds to select: 36385.
Run Code Online (Sandbox Code Playgroud)
所以,很明显我的问题是循环:
foreach (LogRecord record in query)
{
listView.SelectedItems.Add(record);
}
Run Code Online (Sandbox Code Playgroud)
我觉得必须有一种更好的方法来添加到选定项目列表中,或者至少在已设置所有选定项目之前,阻止列表中的数据模板更新(或类似的操作)。在WPF ListView中尝试以编程方式选择多个项目时,有什么方法可以获得更好的性能?
SelectedItems您可以调用该SetSelectedItems方法,而不是将选定的项一个接一个地添加到属性中。不幸的是,该方法受到保护,因此您必须创建一个派生的ListBox使其公开可用:
public class MyListView : ListView
{
public void SelectItems(IEnumerable items)
{
SetSelectedItems(items);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |