我有一个具有可变列数的WPF Datagrid,并在运行时使用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,它不是一个优雅的解决方案,应该避免。但这是我设法完成这项工作的唯一方法。
有更好的方法来改变细胞的背景颜色吗?我可以在不知道设计时的值的情况下使用触发器执行此操作吗?如果是这样,怎么样?
答案 0 :(得分:1)
DataGrid
VirtualizationMode
默认为Recycling
,这意味着它会重复使用它生成的DataCell
来提高性能。它不必创建 n次控件。
将此添加到您的DataGrid
VirtualizingStackPanel.VirtualizationMode="Standard"
请注意,它会影响您的效果,而WPF会创建 n次的控制权。