在将大量数据数据绑定到WPF DataGrid期间挂起

时间:2010-05-04 13:38:35

标签: c# wpf datagrid binding

我使用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挂起!我做错了什么?
UPDATE 我认为这是因为ScrollViewer包含整个网格。但为什么?

2 个答案:

答案 0 :(得分:2)

昨天我遇到了类似的情况(这就是我发现这篇文章的方式),经过多次努力,这是我学到的教训。我希望它也有助于其他人。

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

答案 1 :(得分:1)

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

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