我有多个绑定到DataTables的DataGrids,它们是使用SQL动态创建的。每当DataTable记录更改(添加,修改,删除)时,DataGridCells都应相应地更改其背景颜色(绿色=新,黄色=修改等)。
在WinForms中,我使用_RowPostPaint更改了DataGridView的背景颜色(代码非常简化):
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;
}
}
我不想像在countless examples like this中那样在XAML中对列依赖项进行硬编码,因为它们是在运行时创建的,并且我使用了许多DataGrids。
尝试使用DataGrid_CellEditEnding失败,因为它不会在排序等时保留更改。
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等进行排序时不会保留样式。
如何确保保持颜色变化?在我看来,最好的解决方案是以某种方式将DataRows绑定到一个帮助器类,并在DataTable更改时返回相应的样式。但是我还没有看到任何例子。
答案 0 :(得分:1)
为了完整性:
如果您真的打算在运行时更改颜色,忽略MVVM,您可以使用DataGrid_LoadingRow,检查它的DataContext(在本例中为DataRowView)并从那里继续:
// 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实际处理此问题,请转到this solution。