WPF:在运行时动态更改 DataGrid 单元格/行背景颜色 [英] WPF: Change DataGrid cell/row background color dynamically at runtime

查看:273
本文介绍了WPF:在运行时动态更改 DataGrid 单元格/行背景颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有多个 DataGrid 绑定到 DataTable,它们是使用 SQL 动态创建的.每当 DataTable 记录更改(添加、修改、删除)时,DataGridCell 应相应地更改其背景颜色(绿色 = 新建、黄色 = 修改等).

I have multiple DataGrids bound to DataTables, which are dynamically created using SQL. Whenever DataTable records change (add, modify, delete), the DataGridCells shall change their background color accordingly (green=new, yellow=modify etc.).

在 WinForms 中,我使用 _RowPostPaint 更改了 DataGridView 的背景颜色(代码非常简化):

In WinForms I changed DataGridView's background color using _RowPostPaint (code is very simplified):

private void DataGridViewTest_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    DataRow row = (this.Rows[e.RowIndex].DataBoundItem as DataRowView).Row;
    switch (row.RowState)
    {
        case DataRowState.Added:
            myBitmap = new Bitmap(imageList.Images[1]);
            this[0, e.RowIndex].Style.BackColor = CellChangesColorAdded;
            break;
        case DataRowState.Modified:
            string sValOld = row[0, DataRowVersion.Original].ToString();
            string sValNew = row[0].ToString();
            if (sValOld != sValNew)
            {
                this[0, e.RowIndex].Style.BackColor = CellChangesColorMod;
            }
            break;
        case DataRowState.Deleted:
            this[0, e.RowIndex].Style.BackColor = CellChangesColorDel;
            break;
    }
}

我不想像 无数示例中那样在 XAML 中对列依赖项进行硬编码这是,因为它们是在运行时创建的,我有很多 DataGrid 在使用.

I do not want to hardcode column dependencies in XAML as in countless examples like this as they are created at run time and I have many DataGrids in use.

尝试使用 DataGrid_CellEditEnding 失败,因为它不会在排序等时保留更改:

Trying to use DataGrid_CellEditEnding fails, as it does not keep the changes upon sorting etc.:

XAML:

<Window.Resources>
    <Style x:Key="MyStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="Background" Value="Green" />
    </Style>
</Window.Resources>
<DataGrid x:Name="dataGrid" Grid.Row="4" Grid.ColumnSpan="6"
    ItemsSource="{Binding}"
>
</DataGrid>

.cs:

dataGrid.DataContext = dataTable.DefaultView; // Table filled by SQL query
dataGrid.CellEditEnding += dataGrid_CellEditEnding;

// Problem: Color changes disappear when user sorts DataGrid
    private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit)
        {
            TextBox tb = e.EditingElement as TextBox;
            DataGridCell cell = tb.Parent as DataGridCell;
            // evaluate row changes and change color accordingly
            //cell.Background = new SolidColorBrush(Colors.Yellow); // set style instead of color
            cell.Style = (Style)this.Resources["MyStyle"]; // color is changed to green, according to defined style
        }
    }

这将完美地更改背景颜色,但是在对 DataGrid 等进行排序时不会保留样式.

This changes the background color perfectly fine, however the style is not being kept upon sorting the DataGrid etc.

我怎样才能确保颜色的变化得以保留?在我看来,最好的解决方案是以某种方式将 DataRows 绑定到辅助类并在 DataTable 更改时返回相应的样式.但是我还没有看到任何例子.

How can I ensure color changes are being kept? In my opinion, the best solution would be to somehow bind DataRows to a helper class and return the respective style upon DataTable changes. However I haven't seen any example for that yet.

推荐答案

为了完整性:

如果您真的打算在运行时更改颜色,不考虑 MVVM,您可以例如使用 DataGrid_LoadingRow,检查它的 DataContext(在本例中为 DataRowView)并从那里继续:

If you really intend to change the color at runtime, disregarding MVVM you can for instance use DataGrid_LoadingRow, check for it's DataContext (in this case a DataRowView) and go on from there:

// Changes beeing made to the entire row in this case
private void DgModules_LoadingRow(object sender, DataGridRowEventArgs e)
{
    DataGridRow gridRow = e.Row;
    DataRow row = (gridRow.DataContext as DataRowView).Row;
    switch (row.RowState)
    {
        case DataRowState.Added:
            gridRow.Background = new SolidColorBrush(Colors.Green);
            break;
        case DataRowState.Modified:
            gridRow.Background = new SolidColorBrush(Colors.Yellow);
            break;
        case DataRowState.Deleted:
            gridRow.Background = new SolidColorBrush(Colors.Red);
            break;
    }
}

如果您想实际使用 MVVM 来解决这个问题,请访问 这个解决方案.

If you wanna approach this actually using MVVM, go for this solution.

这篇关于WPF:在运行时动态更改 DataGrid 单元格/行背景颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆