2009-11-06 102 views
0

我正在将我的应用程序从Windows窗体移植到WPF。我发现datagrid只能通过WPF Toolkit获得。不过,我有一些性能问题。这可能是因为在Windows窗体中执行正常的东西不能在wpf中执行,因为它必须以不同的方式实现。总之,我这样做是这样的:wpf工具包datagrid性能

// XAML 
<toolkit:DataGrid x:Name="dataGrid" ItemsSource="{Binding Path=.}"/> 


// C# 
DataTable dataTable = new DataTable(); 
MyViewModel viewModel = new MyViewModel(); 

this.dataGrid.AutoGenerateColumns = false; 
this.dataGrid.CanUserAddRows = false; 
this.dataGrid.CanUserDeleteRows = false; 
this.dataGrid.CanUserReorderColumns = true; 
this.dataGrid.CanUserResizeColumns = true; 
this.dataGrid.CanUserResizeRows = false; 
this.dataGrid.CanUserSortColumns = true; 
this.dataGrid.IsReadOnly = true; 
this.dataGrid.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
this.dataGrid.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; 

    this.dataGrid.ColumnHeaderHeight = 18; 
    this.dataGrid.RowHeight = 18; 
    this.dataGrid.DataContext = vm.dataGrid; 

    List<string> s = new List<string>(); 

    for (int i = 0; i < 80; ++i) 
    { 
     s.Add("col" + i); 
    } 

    for (int i = 0; i < s.Count; ++i) 
    { 
     dataTable.Columns.Add(new DataColumn(s[i], typeof(string))); 

     Binding items = new Binding(); 
     PropertyPath path = new PropertyPath(dataTable.Columns[i].ColumnName); 
     items.Path = path; 

     DataGridColumn dc = new DataGridTextColumn() 
     { 
      Header = dataTable.Columns[i].ColumnName, 
      Width=70, 
      Binding = items 
     }; 

     this.dataGrid.Columns.Add(dc); 
    } 

    viewModel.dataGrid = dataTable; 
    this.dataGrid.DataContext = viewModel.dataGrid; 

    for (int i = 0; i < 1000; ++i) 
    { 
     var row = dataTable.NewRow(); 
     for (int j = 0; j < s.Count; ++j) 
     { 
      row[s[j]] = "text" + s[j] + j; 
     } 
     dataTable.Rows.Add(row); 
    } 

以上是简单地通过结合各头产生相同数量的列的样品。 当这加载时,我得到所有元素正确显示,但滚动非常缓慢。我知道有人可能会说我呈现了80列和1000个元素,但我在窗体表单应用程序中显示了超过10000个,并且没有任何问题。 与Windows窗体的唯一区别是,而不是使用绑定,我每次更新它时将dataGridView的dataSource设置为DataTable。 任何想法?我究竟做错了什么?

回答

2

尝试设置EnableRowVirtualization = True