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

WPF TabItem切换填充DataGrid时空引用异常修复咨询

修复WPF TabControl切换时DataGrid空引用异常

我来帮你搞定这个空引用的问题!先捋清楚错误根源,再给几个实用的修复方案:

错误原因

看你的XAML代码,每个TabItem的Content直接就是DataGrid,根本没有嵌套Grid控件,但你在SelectionChanged事件里强行把tabItem.Content转换成Grid,这就导致grid变量为null,后续调用GetChildOfType<DataGrid>()自然拿不到任何控件,最终在dataGrid.ItemsSource = employees;这行触发空引用异常。

另外还有两个小细节必须先修正:

  • 三个SetX_DG方法里都少了等号,比如var sourcea UIAdapter.GetSourceA();要改成var sourcea = UIAdapter.GetSourceA();,否则编译会报错。
  • 事件方法名拼写错误:ABC_TC_SelectionChenged应该是ABC_TC_SelectionChanged(最后一个字母是d),不然XAML里的事件绑定会失效。

修复方案

方案一:复用已有填充方法(最推荐)

你已经写好了SetA_DG、SetB_DG、SetC_DG三个填充方法,完全可以根据选中的Tab索引直接调用对应方法,简单又不易出错:

private void ABC_TC_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var tabControl = (TabControl)sender; 
    switch(tabControl.SelectedIndex)
    {
        case 0: // 选中AAA标签页
            SetA_DG();
            break;
        case 1: // 选中BBB标签页
            SetB_DG();
            break;
        case 2: // 选中CCC标签页
            SetC_DG();
            break;
    }
}

方案二:修正控件查找逻辑

如果想保留动态查找控件的思路,直接把TabItem.Content转换成DataGrid即可,因为它本身就是DataGrid,不需要绕弯找Grid:

private void ABC_TC_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    TabControl tabControl = (TabControl)sender; 
    var selectedTab = tabControl.SelectedItem as TabItem; 
    
    if(selectedTab == null) return;
    
    var dataGrid = selectedTab.Content as DataGrid; 
    if(dataGrid == null) return;

    // 根据选中的TabItem加载对应数据源
    switch(selectedTab.Name)
    {
        case "A_TI":
            dataGrid.ItemsSource = UIAdapter.GetSourceA();
            break;
        case "B_TI":
            dataGrid.ItemsSource = UIAdapter.GetSourceB();
            break;
        case "C_TI":
            dataGrid.ItemsSource = UIAdapter.GetSourceC();
            break;
    }
}

注意:原代码里的employees变量和你原本的数据源不匹配,所以这里直接用了你写的UIAdapter.GetSourceX()方法,如果employees是通用数据源,替换成dataGrid.ItemsSource = employees;即可。

额外优化:避免重复加载数据

如果切换到已加载过的Tab页不想重复请求数据源,可以给每个Tab加个标记,比如用Tag属性记录是否已加载:

<TabItem x:Name="A_TI" IsSelected="True" Header="AAA" Tag="False">

然后在事件里判断:

if(selectedTab.Tag.ToString() == "False")
{
    // 执行加载数据的逻辑
    selectedTab.Tag = "True";
}

内容的提问来源于stack exchange,提问作者eugz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:57:56