3

DataGridで値が更新されている場合、セルの色を黄色に変更しようとしています。

私のXAML:

<toolkit:DataGrid x:Name="TheGrid"
                  ItemsSource="{Binding}"
                  IsReadOnly="False"
                  CanUserAddRows="False"
                  CanUserResizeRows="False"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="False"                             
                  SelectionUnit="CellOrRowHeader" 
                  EnableColumnVirtualization="True" 
                  VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Auto">
    <toolkit:DataGrid.CellStyle>
        <Style TargetType="{x:Type toolkit:DataGridCell}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="True">
                    <Setter Property="Background" Value="Yellow"/>
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </toolkit:DataGrid.CellStyle>
</toolkit:DataGrid>

グリッドは配列のリストにバインドされます(Excelのような値のテーブルを表示します)。配列の各値は、IsDirty依存関係プロパティを含むカスタムオブジェクトです。値が変更されると、IsDirtyプロパティが設定されます。

私がこれを実行すると:

  • 列1の値を変更=行全体が黄色になります
  • 他の列の値を変更する=何も起こりません

どの列にあるかに関係なく、変更されたセルだけを黄色にしたいのです。XAMLに何か問題がありますか?

4

1 に答える 1

8

これが発生する理由は、DataContextが行レベルで設定され、 ごとに変更されないためですDataGridCell。したがって、IsDirtyそれにバインドすると、セル レベルのデータ オブジェクトではなく、行レベルのデータ オブジェクトのプロパティにバインドされます。

あなたの例は false に設定したことを示しているので、実際の値フィールドにバインドするように設定されたプロパティを使用しAutoGenerateColumnsて列を自分で生成すると仮定します。セルのスタイルを黄色に変更するには、次のようにそれぞれを変更する必要があります。DataGridTextColumnBindingCellStyleDataGridColumn

foreach (var column in columns)
{
    var dataColumn =
        new DataGridTextColumn
            {
                Header = column.Caption,
                Binding = new Binding(column.FieldName),
                CellStyle = 
                new Style
                    {
                        TargetType = typeof (DataGridCell),
                        Triggers =
                            {
                                new DataTrigger
                                    {
                                        Binding = new Binding(column.FieldName + ".IsDirty"),
                                        Setters =
                                            {
                                                new Setter
                                                    {
                                                        Property = Control.BackgroundProperty,
                                                        Value = Brushes.Yellow,
                                                    }
                                            }
                                    }
                            }
                    }
            };
    _dataGrid.Columns.Add(dataColumn);
}

DataContextを使用して、各セルの変更を試すことができますDataGridColumn.CellStyle。おそらく、各列に対して個別に行うことなく、セルをグリッドレベルのスタイルから直接「IsDirty」にバインドできるようになります。しかし、これをテストする必要がある実際のデータモデルはありません。

于 2010-05-17T21:38:57.957 に答える