WPF:将大型集合绑定到 GridControl

本文关键字:绑定 GridControl 集合 大型 WPF | 更新日期: 2023-09-27 18:37:08

我刚刚开始我的第一个WPF项目,今天早上遇到了一个问题。有一大堆位置 (50.000) 我想绑定到 GridControl

    public void BindData()
    {
        //disabling the control seemed to shorten the UI lock.
        gcLocations.IsEnabled = false; 
        Task.Factory.StartNew(() =>
        {
            gcLocations.SetPropertyThreadSafe("ItemsSource", OceanData.OceanPorts.Values);
        });
        gcLocations.IsEnabled = true; 
    }
    public static void SetPropertyThreadSafe(this Control control, string propertyName, object value)
    {
        Type type = control.GetType();
        var prop = type.GetProperty(propertyName);
        if(prop == null)
        {
            throw new Exception(string.Format("No property has been found in '{0}' with the name '{1}'", control, propertyName));
        }
        object[] param = new object[] { propertyName, prop.PropertyType, value };
        if(prop.PropertyType != typeof(object) && prop.PropertyType != value.GetType())
        {
            throw new Exception(string.Format("Property types doesn't match - property '{0}' (type:{1}) and value '{2}'(type:)", param));         
        }
        if(control.Dispatcher.CheckAccess())
        {
            prop.SetValue(control, value);
        }
        else
        {
            control.Dispatcher.BeginInvoke(new Action(() =>
            {
                prop.SetValue(control, value);
            }), DispatcherPriority.ContextIdle, null);
        }
    }

因为我希望我的应用程序保持对用户的响应,所以我一直在寻找一种一次性绑定此数据的替代方法。所以我想到了这个想法。当接口中发生锁定时,是否可以暂停绑定操作,以便接口可以自行更新?我对编程很陌生,所以请原谅我的无知:)

谢谢~~

WPF:将大型集合绑定到 GridControl

DevExpress GridControl 支持数据虚拟化,即仅构造屏幕上可见的控件/项并将其添加到可视化树中。此外,当您向下滚动列表时,这些可见控件通常会被回收,从而节省重新生成它们的成本。

如果您不熟悉虚拟化,请考虑一个简单的列表视图示例:您可以将包含 10,000 个项目的数据源绑定到该数据源,但任何时候用户可能只能看到 20 个项目。虚拟化机制可确保仅创建可见的列表项。如果没有此功能,列表框必须创建 10,000 个 WPF 列表项(这些列表项又可能包含多个控件或 UI 元素),并将这些列表项保存在内存中并将它们添加到可视化树中,即使它们不可见。WPF 控件只能添加到 UI 线程上的可视化树中,这将导致代码挂起。

DevExpress

GridControl 似乎支持开箱即用的虚拟化,但可以通过使用自己的 DevExpress 数据源类来增强它。查看此文档...您可能需要使用 LinqServerModeDataSource 或 LinqInstantFeedbackDataSource 类来为您提供所需的性能。