WPF:在运行时动态更改DataGrid单元格/行背景色

编程入门 行业动态 更新时间:2024-10-27 14:33:56
本文介绍了WPF:在运行时动态更改DataGrid单元格/行背景色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有多个绑定到DataTable的DataGrid,这些DataGrid是使用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 I中使用_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中的列依赖性硬编码为在这样的无数示例中,它们是在运行时创建的,

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单元格/行背景色

本文发布于:2023-11-05 04:25:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1559895.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单元格   背景色   动态   WPF   DataGrid

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!