Я работаю с сеткой данных WPF Toolkit, и в настоящий момент она прокручивается очень медленно. В сетке 84 столбца и 805 строк. (Включая 3 фиксированных столбца и заголовок фиксирован.) Прокрутка как по горизонтали, так и по вертикали чрезвычайно медленная. Виртуализация включена, и я включил виртуализацию столбцов и виртуализацию строк явно в xaml. Есть ли что-то, что можно было бы наблюдать за тем, что может реально повлиять на производительность, например, методы привязки или то, что xaml находится в каждом шаблоне celltemplate?
Следует отметить, что я динамически добавляю столбцы в создание datagrid. Может ли это что-то сделать? (Я также динамически создаю celltemplate в то же время, чтобы мои привязки были установлены правильно.)
Ниже приведен код шаблона для большинства генерируемых ячеек. В основном для столбцов, которые мне нужно динамически добавлять (это большинство из них), я просматриваю список и добавляю столбцы с помощью метода AddColumn, а также динамически строю шаблон, чтобы операторы привязки правильно индексировали нужный элемент в коллекции для этой колонки. Шаблон не слишком сложный, всего два блока TextBlocks, но я привязываю к ним по четыре разных свойства. Похоже, я смог выжать немного больше производительности, изменив привязки к OneWay:
private void AddColumn(string s, int index)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = s;
//Set template for inner cell two rectangles
column.CellTemplate = CreateFactViewModelTemplate(index);
//Set Style for header, ie rotate 90 degrees
column.HeaderStyle = (Style)dgMatrix.Resources["HeaderRotateStyle"];
column.Width = DataGridLength.Auto;
dgMatrix.Columns.Add(column);
}
//this method builds the template for each column in order to properly bind the rectangles to their color
private static DataTemplate CreateFactViewModelTemplate(int index)
{
string xamlTemplateFormat =
@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column=""0"" MinHeight=""10"" MinWidth=""10"" HorizontalAlignment=""Stretch"" Padding=""3 1 3 1"" TextAlignment=""Center"" Foreground=""{Binding Path=FactViewModels[~Index~].LeftForeColor,Mode=OneWay}"" Background=""{Binding Path=FactViewModels[~Index~].LeftColor,Mode=OneWay}"" Text=""{Binding Path=FactViewModels[~Index~].LeftScore,Mode=OneWay}"" />
<TextBlock Grid.Column=""1"" MinHeight=""10"" MinWidth=""10"" HorizontalAlignment=""Stretch"" Padding=""3 1 3 1"" TextAlignment=""Center"" Foreground=""{Binding Path=FactViewModels[~Index~].RightForeColor,Mode=OneWay}"" Background=""{Binding Path=FactViewModels[~Index~].RightColor,Mode=OneWay}"" Text=""{Binding Path=FactViewModels[~Index~].RightScore,Mode=OneWay}"" />
</Grid>
</DataTemplate>";
string xamlTemplate = xamlTemplateFormat.Replace("~Index~", index.ToString());
return (DataTemplate)XamlReader.Parse(xamlTemplate);
}