現在、DataGrid を使用しています。C# では約 24 列が動的に作成されます。
私の DataGrid には常に約 300 のエントリがあります (1 つのエントリが「タイトル」を表すため、ページング システムを作成できません。同じページにすべてのデータを取得する必要があるためです)。
それはうまくいきますが、DataGridTemplateColumn
s(各列に2つのサブ列が必要なため、セパレーターと2つのタイトルを持つスタイル付きの列ヘッダーが必要なため)とセルテンプレート(これらの2つのサブ列が必要なため)を使用すると、ダブルバインディング (サブ列ごとに 1 つのバインディング) があり、グリッドをロードすると、使用できなくなります...
すべてのタイプの仮想化 (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」のコレクションにバインドされています。Object クラスにはpublic Dictionary<string, MyCell> MyObject { get; set; }
MyCell クラスがあり、FirstBinding および SecondBinding プロパティ (文字列) があります。