我目前正在使用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