-1

我目前正在使用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屬性(字符串)。

+0

怎麼沒有你DataGridTemplateColumn的表現?也許你應該爲此發佈代碼。 – blindmeis 2011-05-20 07:59:05

+0

我知道低性能是因爲DataGridTemplaceColumns ...但我不能使用另一種類型的列,因爲我必須有一個Styled Header(不僅僅是一個字符串作爲頭)和單元模板(每個綁定2個cell):/ – metalcam 2011-05-20 08:07:01

+0

你可以發佈你的代碼/ xaml的TemplateColumn? – blindmeis 2011-05-20 08:13:34

回答

-1

我有一個DataGrid類似的問題,它在窗口大小調整,列排序等操作後花費了幾秒的時間來刷新,並鎖定了窗口UI(1000行,5列)。

它回到了一個問題(錯誤?)與WPF大小計算。我把它放在一個RowDefinition Height =「Auto」的網格中,通過測量每一列和每一行的大小,導致渲染系統試圖在運行時重新計算DataGrid的大小,大概是通過填充整個網格據我所知)。它應該以某種方式智能處理,但在這種情況下不是。

快速檢查這是否是相關問題,是在測試期間將DataGrid的高度和寬度屬性設置爲固定大小,然後再次運行。一旦恢復性能,永久修復可以是這些選項中選擇:

  • 變化的含元件的尺寸可相(*)或 固定值
  • 集MaxHeight和數據網格到的MaxWidth固定值大 比它可能在正常使用
  • 嘗試用不同的大小調整戰略的另一個容器類型得到(電網,DockPanel中,等)