【问题标题】:Hang during databinding of large amount of data to WPF DataGrid在将大量数据数据绑定到 WPF DataGrid 期间挂起
【发布时间】:2010-05-04 13:38:34
【问题描述】:

我正在使用 WPFToolkit 数据网格控件并以这种方式进行绑定:

<WpfToolkit:DataGrid x:Name="dgGeneral" SelectionMode="Single"
                              SelectionUnit="FullRow"
                              AutoGenerateColumns="False"
                              CanUserAddRows="False"
                              CanUserDeleteRows="False" 
                              Grid.Row="1"  ItemsSource="{Binding Path=Conversations}" >


public List<CONVERSATION> Conversations
        {
            get { return conversations; }
            set
            {
                if (conversations != value)
                {
                    conversations = value;
                    NotifyPropertyChanged("Conversations");
                }
            }
        }  

public event PropertyChangedEventHandler PropertyChanged; 

public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

public void GenerateData()
         {
            BackgroundWorker bw = new BackgroundWorker();

            bw.WorkerSupportsCancellation = bw.WorkerReportsProgress = true;
            List<CONVERSATION> list = new List<CONVERSATION>();

            bw.DoWork += delegate { list = RefreshGeneralData(); };

            bw.RunWorkerCompleted += delegate
                                         {
                                             try
                                             {
                                                 Conversations = list;
                                             }
                                             catch (Exception ex)
                                             {
                                                 CustomException.ExceptionLogCustomMessage(ex);
                                             }

                                         };

            bw.RunWorkerAsync();
        }


在将窗口的 DataCotext 设置为包含 GenerateData() 的类实例之后,我在主窗口中调用 GenerateData()。

RefreshGeneralData() 返回一些我想要的数据列表,它会快速返回。
总体而言,有近 2000 条记录和 6 列(我没有发布我在网格初始化期间使用的代码,因为我认为这不是原因)并且网格挂起近 10 秒!
---
PS 我找到了项目,写法类似,但即使绑定50000条记录也是在没有UI的情况下完成的!我在做什么错?
更新我认为这是因为 ScrollViewer,其中包含整个网格。但为什么?

【问题讨论】:

  • 问题是:如何加快绑定速度?
  • 或者你可以给我一个方向..关于如何正确地将数据绑定到数据网格。我是 WPF 新手,没想到会出现这种问题

标签: c# wpf datagrid binding


【解决方案1】:

我昨天遇到了类似的情况(这就是我发现这篇文章的方式),经过一番挣扎,这是我学到的教训。我希望它也对其他人有所帮助。

问题是datagrid的容器网格的width属性设置为Auto。我的数据网格只有大约 500 行,每行 5 列,但在这种自动模式下,它永远挂着。一旦我将其更改为 * 或固定宽度。马上就可以了。

【讨论】:

    【解决方案2】:

    除非您明确禁用它,否则 DataGrid 中的项目将被虚拟化,即仅呈现当前显示的项目。由于 UI 自动化,您可能会遇到问题(这已在 .NET 4 中修复)。见http://wpf.codeplex.com/Thread/View.aspx?ThreadId=41964

    如果您安装了 Wacom 平板电脑或屏幕阅读器,就会发生这种情况。

    【讨论】:

    • 不。我使用 .NET4 客户端配置文件和普通 PC。
    • 嗯。也许您可以发布更多代码?特别是 DataGrid 的完整 XAML。分配数据后是否会发生挂起(Conversations = list; 部分)。你确定你只分配一次,之后数据不会改变吗?
    • 我只分配一次,然后在 Conversations = list; 之后挂起;
    • 您可能还需要研究数据虚拟化。
    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2011-05-06
    • 2012-08-17
    • 2011-06-15
    • 2016-10-07
    • 2011-03-22
    相关资源
    最近更新 更多