在WPF Datagrid中更改单个单元格的颜色

时间:2014-10-15 22:24:34

标签: c# wpf .net-4.5

我有一个具有可变列数的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,它不是一个优雅的解决方案,应该避免。但这是我设法完成这项工作的唯一方法。

有更好的方法来改变细胞的背景颜色吗?我可以在不知道设计时的值的情况下使用触发器执行此操作吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

DataGrid VirtualizationMode默认为Recycling,这意味着它会重复使用它生成的DataCell来提高性能。它不必创建 n次控件。

将此添加到您的DataGrid

VirtualizingStackPanel.VirtualizationMode="Standard"

请注意,它会影响您的效果,而WPF会创建 n次的控制权。