Я сейчас использую DataGrid.около 24 столбцов создаются динамически в C #.
В моей DataGrid всегда есть около 300 записей (и поскольку одна запись представляет «заголовок», я не могу создавать системы подкачки, потому что мне нужно получить все данныена той же странице).
Это работает хорошо, но если я использую DataGridTemplateColumn
s (потому что мне нужен стилизованный заголовок столбца, который имеет разделитель и 2 заголовка, так как мне нужно 2 вложенных столбца в каждом столбце)и шаблоны ячеек (все еще потому, что мне нужны эти 2 подстолбца), которые имеют двойную привязку (одну привязку для каждого подстолбца), когда я загружаю сетку, это просто невозможно ...
Я пробовал ВСЕтипы виртуализации (StackPanel, RowVirtualization, ColumnVirtualization со всеми различными типами комбинаций значений).«Лучшая» производительность, которую я мог бы получить, это установить RowVirtualization и ColumnVirtualization в True.
Теперь она «полезна», но все еще очень медленная, когда я выполняю горизонтальную прокрутку (даже с небольшой графической ошибкой, поскольку я используюFrozenColumn ...)
Я даже пытался использовать свой собственный ListView / GridView, и после нескольких часов работы над ним (чтобы воспроизвести замороженный столбец и т. Д.) Все еще остается та же "проблема".
Невозможно использовать виртуализацию данных (поскольку «только» 24 столбца с 285 строками не будут удобны для пользователей).
Спасибо!
РЕДАКТИРОВАТЬ 1: Вот код, генерирующий столбцы
ColumnCollection = new ObservableCollection<DataGridColumn>();
DataGridTemplateColumn firstDtc_l = new DataGridTemplateColumn();
firstDtc_l.Header = "Titles";
FrameworkElementFactory spFactory_l = new FrameworkElementFactory(typeof(Grid));
ColumnCollection.Add(firstDtc_l);
int i = 0;
foreach (string s in DynamicColumns)
{
DataGridTemplateColumn dtc_l = new DataGridTemplateColumn();
Binding bindColor = new Binding();
bindColor.Converter = new ChangedColorConverter();
bindColor.ConverterParameter = "Column" + i;
//DataTemplate
DataTemplate dt_l = new DataTemplate("MyObject");
spFactory_l = new FrameworkElementFactory(typeof(Grid));
spFactory_l.Name = "CellTemplate";
FrameworkElementFactory columnDefinition1 = new FrameworkElementFactory(typeof(ColumnDefinition));
FrameworkElementFactory columnDefinition2 = new FrameworkElementFactory(typeof(ColumnDefinition));
FrameworkElementFactory border1 = new FrameworkElementFactory(typeof(Border));
border1.SetValue(Grid.ColumnProperty, 0);
border1.SetValue(Border.BorderBrushProperty, Brushes.Gray);
border1.SetValue(Border.BorderThicknessProperty, new Thickness(0,0,0,0));
FrameworkElementFactory border2 = new FrameworkElementFactory(typeof(Border));
border2.SetValue(Grid.ColumnProperty, 1);
border2.SetValue(Border.BorderBrushProperty, Brushes.Gray);
border2.SetValue(Border.BorderThicknessProperty, new Thickness(1, 0, 0, 0));
FrameworkElementFactory textBlock1 = new FrameworkElementFactory(typeof(TextBlock));
textBlock1.SetValue(Grid.ColumnProperty, 0);
textBlock1.SetValue(TextBlock.ForegroundProperty, bindColor);
Binding firstBind = new Binding("MyObject[Column"+i+"].FirstBinding");
textBlock1.SetValue(TextBlock.TextProperty, localBind);
FrameworkElementFactory textBlock2 = new FrameworkElementFactory(typeof(TextBlock));
Binding secongBind = new Binding("MyObject[Column" + i + "].SecondBinding");
textBlock2.SetValue(Grid.ColumnProperty, 0);
textBlock2.SetValue(TextBlock.TextProperty, firstBind)
textBlock2.SetValue(TextBlock.ForegroundProperty, secongBind);
border1.AppendChild(textBlock1);
border2.AppendChild(textBlock2);
spFactory_l.AppendChild(columnDefinition1);
spFactory_l.AppendChild(columnDefinition2);
spFactory_l.AppendChild(border1);
spFactory_l.AppendChild(border2);
dt_l.VisualTree = spFactory_l;
dtc_l.Width = DataGridLength.Auto;
dtc_l.CellTemplate = dt_l;
dtc_l.Header = s;
ColumnCollection.Add(dtc_l);
i++;
}
DataGrid связан с коллекцией «TheObject».Класс TheObject имеет public Dictionary<string, MyCell> MyObject { get; set; }
Класс MyCell имеет свойства FirstBinding и SecondBinding (строка).