代码之家  ›  专栏  ›  技术社区  ›  0x49D1

将大量数据数据绑定到wpf datagrid时挂起

  •  0
  • 0x49D1  · 技术社区  · 14 年前

    我使用wpftoolkit datagrid控件,并以这种方式进行绑定:

    <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秒!
    ---
    聚苯乙烯 我发现这个项目,也就是用类似的方式写的,但是即使绑定了5万条记录也没有ui挂在那里!我做错什么了?
    更新 我认为这是因为scrollviewer包含了整个网格。但是为什么呢?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Daniel Rose    14 年前

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

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

        2
  •  2
  •   newman    14 年前

    我昨天遇到了类似的情况(这就是我发现这篇文章的原因),经过许多努力,这是我学到的教训。我希望它也能帮助别人。

    问题是datagrid的容器网格的width属性设置为auto . 我的datagrid只有大约500行,每行有5列,但是在这个自动模式下,它永远挂着。一旦我把它改成*或固定宽度。马上就好。