如何在代码后台设置DataGrid行的背景颜色?

5

我在代码后端创建了一个DataGrid对象,并使用 obj.ItemsSource 设置其内容。

现在我想在代码后端设置一个特定行的背景颜色。我该如何实现这一点?

更新:

我在代码后端创建DataGrid对象的方式如下:

var dataGrid = new DataGrid();
dataGrid.ItemsSource = BuildDataGrid(); // Has at least one row
var row = (DataGridRow) dataGrid.ItemContainerGenerator.ContainerFromIndex(0);
row.Background = Brushes.Red;

但是row对象是null。为什么会这样?

在WPF中,强烈不建议使用过程式代码创建UI元素。应该创建一个适当的ViewModel并使用适当的DataBinding。 - Federico Berasategui
1个回答

12

您可以使用数据网格的 ItemContainerGenerator 获取 DataGridRow

如果您想基于索引值选择行,请使用 ContainerFromIndex() 方法:

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator
                    .ContainerFromIndex(0);

如果想根据项目获取行,请使用ContainerFromItem()方法:

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator
                    .ContainerFromItem(item);

最后在行上设置背景:

row.Background = Brushes.Red;

更新:

只有当数据表格在GUI上可见时,才会生成容器。你需要等待容器生成后,才能设置DataGridRow的任何属性。

所谓容器,指的是数据表格中的DataGridRow。您需要像这样修改代码:

var dataGrid = new DataGrid();
dataGrid.ItemsSource = BuildDataGrid();
dataGrid.ItemContainerGenerator.StatusChanged += (s, e) =>
    {
       if (dataGrid.ItemContainerGenerator.Status == 
                           GeneratorStatus.ContainersGenerated)
       {
          var row = (DataGridRow)dataGrid.ItemContainerGenerator
                                               .ContainerFromIndex(0);
          row.Background = Brushes.Red;
       }
    };

非常感谢。不幸的是,当我最终使用row.Background = Brushes.Red设置行颜色时,我的程序崩溃了。其他所有东西似乎都正常工作。你有什么线索吗?我可能错过了什么吗? - John Threepwood
请发布崩溃异常信息。 - Rohit Vats
你得到这一行了吗?它不是空的吗? - Rohit Vats
好的,我获取的行为空。详见更新说明。 - John Threepwood
1
完美 - 非常感谢你。你真的救了我的一天。如果我理解正确,DataGridRow是在第一次显示DataGrid后生成的。使用StatusChanged事件,您首先检查容器是否已生成,如果是,则设置颜色? StatusChanged事件何时发生?文档只说状态更改时。 - John Threepwood
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接