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

标签 c# .net wpf observablecollection

我有一个 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/

相关文章:

c# - XAML 继承、代码重用、优化

.net - 从 .net 调用 R(编程语言)

.net - .Net 中的反射可以通过查看用户定义的类型名称来帮助动态构建表值参数/SqlMetaData [] 对象吗?

c# - 通用列表的通用扩展方法

c# - 从类运行 MySQL 查询时抛出异常

c# - IValueConverter 的绑定(bind)值重置为默认值

c# - 从函数返回值 - 错误

c# - 有没有人知道 SQL Server 错误号 C# 包装器?

wpf - WCF 服务公开 DTO 或实体

WPF 更改文本框的左边距