WPF C#获取DataGrid选中值报错:超10行时出现空引用异常
解决WPF DataGrid选中多行时的空引用异常问题
这个问题我之前也碰到过!核心原因是WPF DataGrid默认开启了UI虚拟化——当行不在当前可视区域内时,系统不会创建对应的单元格UI元素,这时候调用GetCellContent(item)就会返回null,你再把它强转成TextBlock自然就抛出空引用异常了。10行以内正常是因为这些行都在可视范围内,UI元素都被创建出来了,超过10行后部分行滚出了视图,就触发这个问题了。
给你两个解决方案,优先推荐第一个,更符合WPF的设计思路:
方案一:直接从数据源对象获取属性(推荐)
WPF的DataGrid是用来展示数据的,最可靠的方式是直接从绑定的数据源对象里拿值,而不是去操作UI元素。假设你的DataGrid绑定的是ObservableCollection<YourDataModel>,其中YourDataModel有对应第二列的Name属性,代码可以改成这样:
// 先把SelectedItems转成你的数据模型类型 foreach (var selectedItem in MyGrid.SelectedItems.Cast<YourDataModel>()) { if (selectedItem == null) continue; // 直接取模型的属性,不用碰UI元素 string name = selectedItem.Name; MessageBox.Show(name); }
如果不确定选中项的类型,也可以用as做安全转换:
foreach (var item in MyGrid.SelectedItems) { var dataItem = item as YourDataModel; if (dataItem == null) continue; string name = dataItem.Name; MessageBox.Show(name); }
记得把YourDataModel替换成你实际使用的数据模型类名哦。
方案二:关闭UI虚拟化(不推荐,仅小数据量场景用)
如果实在不想改数据源的方式,可以关闭DataGrid的UI虚拟化,让所有行都创建UI元素。你可以在XAML里设置:
<DataGrid x:Name="MyGrid" VirtualizingStackPanel.IsVirtualizing="False" />
或者在代码里设置:
MyGrid.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, false);
但要注意,这种方式在数据量大的时候会明显降低性能,因为要一次性创建所有行的UI元素,所以只适合数据量很小的场景。
内容的提问来源于stack exchange,提问作者Reza.S
相关产品推荐
相关产品推荐

