Я работаю с сеткой данных WPF Toolkit, и в данный момент она прокручивается крайне медленно. Сетка имеет 84 столбца и 805 строк. (Включая 3 фиксированных столбца и фиксированный заголовок.) Прокрутка по горизонтали и вертикали чрезвычайно медленная. Виртуализация включена, и я явно включил виртуализацию столбцов и виртуализацию строк в xaml. Есть ли что-то, на что стоит обратить внимание, что может реально повлиять на производительность, например, методы привязки или что такое xaml в каждом шаблоне ячейки?
Следует отметить, что я динамически добавляю столбцы при создании сетки данных. Может ли это повлиять на что-нибудь? (Я также динамически создаю шаблон ячейки одновременно, чтобы мои привязки были установлены правильно.)
Ниже приведен код из шаблона для большинства генерируемых ячеек. В основном для столбцов, которые мне нужно динамически добавить (а это большинство из них), я перебираю свой список и добавляю столбцы с помощью метода AddColumn, плюс я динамически создаю шаблон, чтобы операторы привязки правильно индексировали нужный элемент в коллекции для этого столбца. Шаблон не слишком сложен, всего два TextBlocks, но я связываю четыре разных свойства для каждого. Похоже, я смог немного повысить производительность, изменив привязки к OneWay:
private void AddColumn(string s, int index)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = s;
//Set template for inner cell's 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);
}