Я портирую свое приложение из окон в 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 каждый раз, когда я его обновлял. Любые идеи? Что я делаю не так?