2

次のように定義された 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 のスタイルのすべての単一のプロパティを「論理的な」ものにバインドし、論理的なものを変更します。しかし、これは遅いです。

私が自分自身をもう少しうまく説明できたことを願っています。

4

1 に答える 1

1

遅い Xaml が表示される可能性はありますか? データトリガーでこれを行うことはそれほどひどいことではないと思っていたでしょう(.net 4.0として使用しているデータグリッドのバージョンとWPF Toolkitのバージョンは異なります)

選択したアイテムの色を変更するためにこのようなことを行いましたが、遅すぎるようには見えませんでした (これは正しい解決策ではありませんが、これ以上言う前にもう少し詳しく説明したいと思います):

        <Style TargetType="DataGrid">
        <Setter Property="CellStyle">
            <Setter.Value>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="{StaticResource SelectedBackgroundBrush}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                            <Setter Property="Foreground" Value="White" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Setter.Value>
        </Setter>
    </Style>
于 2011-02-01T17:25:01.090 に答える