为什么ItemContainerGenerator.ContainerFromIndex()返回null以及如何避免此行为?

我正在使用此代码段来分析我在数据网格上选择的行。

for (int i = 0; i < dgDetalle.Items.Count; i++) { DataGridRow row = (DataGridRow)dgDetalle.ItemContainerGenerator.ContainerFromIndex(i); FrameworkElement cellContent = dgDetalle.Columns[0].GetCellContent(row); // ... code ... } 

循环运行平稳,但在处理某些索引时,第二行会抛出一个空exception。 MSDN的文档说如果“如果项目没有实现”, ItemContainerGenerator.ContainerFromIndex(i)将返回null,但这无助于我猜测如何获得所需的值。

如何扫描所有行? 还有别的办法吗?

UPDATE

我正在使用这个片段来读取CheckBox ,如此处所述。 所以除非我改变了很多东西,否则我根本不能使用绑定或ItemSource 。 我不能。 我正在进行代码维护。

DataGrid正在虚拟化项目,相应的行(即容器)仅在行处于视图中时创建。

您可以关闭虚拟化 (如果您有许多项目,第一次加载非常慢,内存使用率也会更高),或者您只是迭代数据并检查应绑定的数据对象属性的值到数据网格。 通常你根本不需要UI元素……

试试这个,

 DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); if (row == null) { grid.UpdateLayout(); grid.ScrollIntoView(grid.Items[index]); row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); } 

使用此订阅:

 TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) => { TheListBox.Dispatcher.Invoke(() => { var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; if (TheOne != null) // Use The One }); };