You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预先选中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:21:13