gpt4 book ai didi

c# - WPF C# 4.5 ListBox 更新非常慢

转载 作者:可可西里 更新时间:2023-11-01 11:01:31 28 4
gpt4 key购买 nike

我刚开始使用 Redis,并将其用于我的一个个人项目。 Redis DB 包含大约 10k 个对象

public Class FileList
{
public string FileName { get; set;}
public string FolderName { get; set;}
}

我在列表框中显示此列表 ResultsView最初在负载上。我有一个 TextBox在我可以输入字符的地方和 TextBoxChanged_Event 上我正在调用一个函数,它将在 RedisDB 中查询所有 FileList包含我在 TextBox 中输入的字符的对象并将其存储在 ResultsList<FileList> 中这将在 foreach 中循环然后添加到 ListBox .

开始显示结果至少需要一秒钟,而且速度不是很快。

现在,如果我对 MasterList<FileList> 执行相同的查询,那么它会快一点,但仍然不够快。

昨天,我尝试使用 RavenDb,它费力地花费了很长时间来完成相同的任务。

是不是我要添加 ItemsListBoxforach这要花很多时间,或者有什么可以加快它的速度,比如 ItemSource我试过了,但给了我错误 ItemList should be empty before binding

对于几乎相似的问题,我确实尝试了大部分答案,但没有一个对我有帮助。

代码

ResultsView.Items.Clear();
var redisClient = new RedisClient("localhost");
using (var client = redisClient.As<FileList>())
{
var foldersFromRedis = client.GetAll().Where(fileList => fileList.FileName.Contains(this.Search.Text.ToLower()));
foreach (FileList fileList in foldersFromRedis)
{
var listViewItem = new ListViewItem { Content = fileList.FileName , Tag = fileList.FolderName };
this.ResultsView.Items.Add(listViewItem);
}
}
//this.ResultsView.ItemsSource = ResultsFileList;
<ListBox Height="374" ScrollViewer.VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Left" Margin="10,0,0,0" Name="ResultsView" VerticalAlignment="Bottom" Width="405" BorderThickness="0" SelectionChanged="MovieNameSelectionChanged" FontFamily="Nobile" FontSize="13" Background="#A6FCFCFC" Foreground="Black" FontStretch="Normal">
<GridView>
<GridViewColumn Header="FileName" DisplayMemberBinding="{Binding FileName}"/>
</GridView>
</ListBox>

更新 1:

如下添加 ViewCollectionSource

 private void ApplyViewCollectionSource()
{
_viewSource.Filter += ViewSourceFilter;
_viewSource.Source = _fileList = (List<FileList>)PopulateFileListEnglishWithReturn();
ResultsView.ItemsSource = _viewSource.View;
_timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
_timer.Tick += (o, e) =>
{
_timer.Stop();
_viewSource.View.Refresh();
};
Search.TextChanged += (o, e) => _timer.Start();
}

在构造函数中被调用。过滤器如下:

private void ViewSourceFilter(object sender, FilterEventArgs e)
{

var src = e.Item as FileList;
e.Accepted = src != null;
if (string.IsNullOrEmpty(Search.Text)) return;
var regex = new Regex(Search.Text, RegexOptions.IgnoreCase);
e.Accepted = regex.IsMatch(src.FileName);
}

这非常适合我的要求,但仅在文本框中的第 3 个字符之后。输入第一个字符后,ListBox 需要 2 秒得到更新,第二个字符需要 1 秒。在此之后,它几乎是瞬间的。主列表中大约有 5000 项 _fileList .

有什么方法可以提高前 2 个字符搜索的速度?

最佳答案

不要在每次要筛选时都重新加载数据。 WPF 具有适当的机制来过滤现有数据,而无需往返服务器。考虑使用 CollectionView为你做过滤。 Collection View 允许您更改呈现给用户的内容,而无需触及数据本身。

您可以在这里找到一个工作示例:http://social.msdn.microsoft.com/Forums/vstudio/en-US/0d2b882d-cf56-4385-9b76-dd280c4c35b1/filter-a-readonlycollection-for-binding-a-listview?forum=wpf#213dda80-5d29-47fa-b832-ea7e098590d7

关于c# - WPF C# 4.5 ListBox 更新非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19615817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com