更改WPF数据网格中单个单元格的颜色
本文关键字:单个 单元格 颜色 网格 WPF 数据 数据网 更改 | 更新日期: 2023-09-27 18:26:44
我有一个列数可变的WPF数据网格,在运行时用String[]的2D数组填充。
String[] data = .....;
datagrid.ItemsSource = data;
我需要根据单元格的值来判断单元格的颜色。但是这些值是由用户在执行过程中定义的。我发现的大多数关于更改单元格颜色的示例都在XAML上使用触发器,并且该值在设计时是已知的。
所以我把这个细胞的背景改成这样:
DataGridCell cell = DataGridUtils.GetCell(datagrid, i, j);
cell.Background = new SolidColorBrush(Colors.DarkGreen);
以及GetCell函数:
private DataGridCell GetCell(int rowIndex, int colIndex, DataGrid dg)
{
DataGridRow row = dg.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
DataGridCellsPresenter p = GetVisualChild<DataGridCellsPresenter>(row);
DataGridCell cell = p.ItemContainerGenerator.ContainerFromIndex(colIndex) as DataGridCell;
return cell;
}
乍一看似乎还可以,我可以看到绿色的单元格。但是,如果我把数据网格一直向下滚动,然后再向上滚动,绿色的单元格会变成另一个随机单元格,更多的单元格会变绿。如果我继续上下移动,绿色的细胞就会随机变化。
我知道这听起来很奇怪,但代码中只有一个地方可以改变单元格颜色,那就是点击按钮。我不知道在滚动数据网格时怎么会发生这种情况。
我在某个地方读到ItemContainerGenerator,它不是一个优雅的解决方案,应该避免。但这是我成功的唯一途径。
有没有更好的方法来改变单元格的背景颜色?在不了解设计时的值的情况下,我可以使用触发器执行此操作吗?如果是,如何?
DataGrid
将VirtualizationMode
默认为Recycling
,这意味着它将重用生成的DataCell
以提高性能。它不必创建n次的控件。
将此添加到您的DataGrid
VirtualizingStackPanel.VirtualizationMode="Standard"
请注意,这将影响您的性能,WPF将创建n次的控制。