次のように定義された itemsSource を持つ DataGrid があります。
dg.ItemsSource = new ObservableCollection<myRow>
...
public class myRow : Collection<myDataGridCell> { ... }
...
public interface ImyDataGridCell
{
Brush Background { get; set; }
Brush Foreground { get; set; }
}
次に、列/セルの各タイプのクラスがあります。
public class myTextBoxColumn : DataGridTextColumn {...}
public class myTextBoxCell : TextBox, ImyDataGridCell {...}
次に、各列の CellStyle を次のように設定します。
各列のコンストラクターで:
string source = String.Format(CultureInfo.InvariantCulture, "[{0}].", dataGrid.Columns.Count);
// I set the "source" string to the column's index in the dataGrid's Columns list between [] to get an index in my binding below.
CellStyle = new Style(typeof(DataGridCell));
CellStyle.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new Binding(source + "Background")));
これにより、実際の DataGridCell の Background プロパティをセルの表現の Background プロパティにバインドできるため、いつでも簡単にセルの背景を変更できます。
今、私の主な問題は、この方法で dataGrid が地獄のように遅くなることです...各セルにバインドする約 15 個のプロパティがあり、100 列 x 20 行を表示すると、dataGrid を表示するのに 1 秒以上かかり、次に、水平方向にスクロールすると約 1 秒で更新されます (私の画面では一度に 20 列しか表示できず、dataGrid の仮想化が有効になっています)。
スタイリングを取り除けば、応答時間はまだ私が望むよりも長くなりますが、私はそれでやり遂げることができます.
これを行うためのより良い方法はありますか?
私も Xaml でこのスタイルを試してみましたが、列の仮想化にうまく対応していないようでした。つまり、セルの背景を緑に設定してから、ページ全体を右にスクロールすると、セルが緑に塗ったセルは、赤である必要がある場合は緑のイベントを取得します。値は、現在の行をセルを含む行に移動するまで更新されません...さらに、パフォーマンスがまったく向上していないようです...
この問題について何らかの種類/ヒント/以前の経験があれば共有していただきありがとうございます.
編集:達成したい一般的な効果:
- ダイナミクス列を含む dataGrid (列の数とタイプは実行時にのみ認識されます)
- いつでも、単一のセルのスタイル プロパティを変更できます: フォント (ファミリ、サイズ、スタイル、ウェイト、適用されている場合は装飾)、前景、背景、textAlignment など...
これは私が達成しなければならないことです。列の仮想化がオンになっていると、REAL dataGridCells はまだ表示されていない (仮想化されている) 可能性があるため、操作できず、プロパティ値の変更が失われることがわかりました。だから私はこの「ハック」に行きました: 私は実際の dataGridCell のスタイルのすべての単一のプロパティを「論理的な」ものにバインドし、論理的なものを変更します。しかし、これは遅いです。
私が自分自身をもう少しうまく説明できたことを願っています。