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
相关产品推荐
相关产品推荐

