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它时,它会绑定到行级数据对象的属性,而不是单元格级。

由于您的示例显示您已AutoGenerateColumns设置为 false,因此我假设您自己生成的列具有类似于DataGridTextColumnBinding属性设置为绑定到实际值字段的内容。要将单元格样式更改为黄色,您必须像这样更改CellStyle每个单元格DataGridColumn

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 回答