我目前正在使用DataGrid。约有24列是在C#中动态创建的。Datagrid性能非常低,即使使用UI虚拟化
在我的DataGrid中总是有大约300个条目(因为一个条目代表一个“标题”,我不能创建分页系统,因为我必须获取同一页面中的所有数据)。
它运行良好,但如果我使用DataGridTemplateColumn
(因为我需要一个带有分隔符和2个标题的样式化列标题,因为我需要每列有2个子列)和单元格模板(仍然是因为我需要这些2个子列),它有一个双绑定(每个子列一个绑定),当我加载网格,它只是无法使用...
我试过所有类型的虚拟化(StackPanel,RowVirtualization,ColumnVirtualization与所有不同价值组合的类型)。 我可以得到的“最佳”性能是将RowVirtualization和ColumnVirtualization设置为True。
它现在“可用”,但仍当我做水平滚动很慢(即使有一点点图形臭虫,因为我用的是FrozenColumn ...)
我甚至用我自己的ListView/GridView的审判,经过几个小时的工作(为了重现冻结的柱子等等),仍然有相同的“问题”。
不可能使用数据虚拟化(因为“只有”有285列的24列,它根本不会用户友好)。
谢谢!
EDIT 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属性(字符串)。
怎么没有你DataGridTemplateColumn的表现?也许你应该为此发布代码。 – blindmeis 2011-05-20 07:59:05
我知道低性能是因为DataGridTemplaceColumns ...但我不能使用另一种类型的列,因为我必须有一个Styled Header(不仅仅是一个字符串作为头)和单元模板(每个绑定2个cell):/ – metalcam 2011-05-20 08:07:01
你可以发布你的代码/ xaml的TemplateColumn? – blindmeis 2011-05-20 08:13:34