gpt4 book ai didi

c# - ObservableCollection 快速填充但缓慢绑定(bind)可视化

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:00 25 4
gpt4 key购买 nike

我有一个 ObservableCollection<T>这将容纳很多元素。将使用后台工作程序异步接收数据(这工作得很好而且很快)。

但如果我尝试将庞大的集合绑定(bind)到 BackgroundWorkerCompletedTask 中的列表框/ ListView (无论什么),可视化将花费大量时间,并且 GUI 将挂起,直到绑定(bind)/可视化完成。

关于如何提高性能或防止该行为的任何想法?

void bgGetData_DoWork(object sender, DoWorkEventArgs e)
{
HugeData();
}

void bgGetData_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
devices.Add((ServiceReference1.Device)e.UserState);
}

private void HugeData()
{
foreach (ServiceReference1.Device dev in Proxy.client.GetHugeDate())
{
bgGetData.ReportProgress(0, dev);
}
}

数据受限于:

myControl.ItemsSource = devices;

谢谢。

最佳答案

我有一个非常相似的问题,既关于集合数据,也关于为集合中的项目设置组名(我想允许空组,所以我手动更新 PropertyGroupDescriptor.GroupNames)。

事实证明,当添加到 ObservableCollection 时,您会在添加的每一行 上触发 CollectionChanged 事件,如果您更改组,您将更新 的组和行每个组。

解决方案是在集合上使用 AddRange,遗憾的是它不存在,并且您不能从包含组名的 ObservableCollection 继承,因为它来自保存数据的集合的 PropertyGroupDescriptor ...但是... cludgiest cludgiest 你可以使用反射在底层项目中获得。

所以,我展示了我非常讨厌的 GroupNames 更新代码:-

    public void CheckGroups(ObservableCollection<Object> GroupNames) {
var lBindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;

if (mHasUpdates) {

var lHashC = new HashSet<Object>(GroupNames);
var lHashN = new HashSet<Object>(mGroupList);

var lAdd = lHashN.Except(lHashC).ToList();
var lRemove = lHashC.Except(lHashN).ToList();

if (lAdd.Count > 0 || lRemove.Count > 0) {

var lType = GroupNames.GetType();
var lProp = lType.GetProperty("Items", lBindingFlags);
var lItems = (List<Object>)lProp.GetValue(GroupNames, null);
var lMethod = lType.GetMethod("OnCollectionChanged", lBindingFlags, null, new Type[] { typeof(NotifyCollectionChangedEventArgs) }, null);
var lArgs = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);

if (lAdd.Count > 0) lItems.AddRange(lAdd);
if (lRemove.Count > 0) lItems.RemoveAll(R => lRemove.Contains(R));

lMethod.Invoke(GroupNames, new Object[] { lArgs });

}
}

}

关于c# - ObservableCollection<T> 快速填充但缓慢绑定(bind)可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18942904/

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