2009-11-06 2 views
0

Я портирую свое приложение из окон в WPF. Я обнаружил, что datagrid доступен только через WPF Toolkit. Однако у меня есть некоторые проблемы с производительностью. Это может быть связано с тем, что что-то, что отлично работает в формах Windows, не в wpf, поскольку оно должно выполняться по-разному. Во всяком случае, я делаю что-то вроде этого:wpf toolkit datagrid performance

// 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, и никаких проблем с ним не возникало. Единственное отличие от Windows Forms заключается в том, что вместо использования Binding i я устанавливал dataSource dataGridView в DataTable каждый раз, когда я его обновлял. Любые идеи? Что я делаю не так?

ответ

2

Попробуйте установить EnableRowVirtualization = True

Смежные вопросы