gpt4 book ai didi

wpf - 在 WPF 中更新 ObservableCollection 会导致屏幕闪烁;我该如何预防?

转载 作者:行者123 更新时间:2023-12-04 06:48:31 24 4
gpt4 key购买 nike

我有一个 ObservableCollection 以 MVVM 模式绑定(bind)到 WPFToolkit DataGrid。每隔 30 秒,我就有一个后台线程正在查询服务以获取某些数据。当它返回时,它会将其编码到 UI 线程并更新 ObservableCollection,方法是首先在集合上调用 Clear(),然后为每个项目调用 Add()。发生这种情况时,数据会正确更新到屏幕上,但是数据网格会闪烁。我怎样才能防止这种情况发生?

最佳答案

我为您的问题创建了一个简单但最强大的解决方案:

public class MyCollection<T> : ObservableCollection<T>
{
private bool _isInEditMode = false;

public void BeginEdit()
{
_isInEditMode = true;
}

public void CommitEdit()
{
_isInEditMode = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (_isInEditMode == false)
{
base.OnCollectionChanged(e);
}
}
}

当您处于编辑模式时,我的集合类可防止集合更改事件。在清除项目之前启动“BeginEdit”。然后添加您的新项目。完成后,使用“CommitEdit”, View 只会刷新一次。

如果用一个简单的列表框对其进行了测试,我会在其中添加 1.000.000 个字符串项。试试这个。这很有趣 :)
 private void Button_Click(object sender, RoutedEventArgs e)
{
MyCollection<string> list = testBox.ItemsSource as MyCollection<string>;
//list.BeginEdit();
for (int i = 0; i < 1000000; i++)
{
list.Add("test " + i);
}
list.CommitEdit();

}

从 list.BeginEdit() 中删除//并查看差异。它大约 15 秒再次 < 1 秒。

问候,

关于wpf - 在 WPF 中更新 ObservableCollection 会导致屏幕闪烁;我该如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448736/

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