预先选中ListView记录后重载报错:触发System.NullReferenceException
解决ListView重载数据时的NullReferenceException问题
这个空引用异常我之前也碰到过几次,大概率是重载ListView数据时触发了SelectionChanged事件,但此时没有有效的选中项,或者相关控件/变量没处理好null的情况。咱们一步步来排查解决:
1. 给SelectionChanged事件加空值判断是关键
当你点击Go按钮重载数据时,ListView会先清空原有数据,这时候SelectionChanged事件会被触发,但此时SelectedItem是null(因为没有选中项了)。如果你的代码直接访问选中项的ProductId,就会抛出空引用异常。
比如你原来的代码可能是这样的(没有空值判断):
private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedProduct = listView.SelectedItem as Product; prodName = selectedProduct.ProductId; // 这里selectedProduct为null时直接报错 SelectedProductName.Text = prodName; }
修改成带空值判断的版本:
private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedProduct = listView.SelectedItem as Product; if (selectedProduct != null) { prodName = selectedProduct.ProductId; SelectedProductName.Text = prodName; } else { // 可选:清空文本块或者提示未选中 prodName = string.Empty; SelectedProductName.Text = "未选择产品"; } }
2. 确保SelectedProductName控件已正确初始化
有时候如果这个TextBlock的XAML名称拼写错误,或者它是在数据模板里动态生成的(比如ListView的ItemTemplate里),你在代码后台直接访问时会得到null。检查一下:
- XAML里的
Name属性是不是准确写的SelectedProductName - 如果它在模板里,要通过VisualTreeHelper去查找,而不是直接访问名称
3. 重载数据前手动取消选中状态(可选优化)
在点击Go按钮加载新数据前,先主动清空ListView的选中项,避免数据重置时触发不必要的SelectionChanged事件:
private void GoButton_Click(object sender, RoutedEventArgs e) { // 先取消选中,避免触发无效的SelectionChanged listView.SelectedItem = null; // 然后执行你的数据加载逻辑 LoadProductDataFromDB(); }
4. 初始化prodName变量
如果prodName是类级别的字符串变量,记得一开始就初始化它,避免它为null导致后续其他操作报错:
// 类级别变量初始化 private string prodName = string.Empty;
一般来说,加上第一步的空值判断就能解决大部分情况,因为重载数据时ListView的选中项会被清空,触发SelectionChanged但没有有效选中项,这时候的空值判断会跳过错误的赋值操作。
内容的提问来源于stack exchange,提问作者positive perspective
相关产品推荐
相关产品推荐

