绑定对象列表的DataGrid如何显示指定列?解决ItemsSource报错
问题解决:DataGrid指定列显示时的ItemsSource冲突异常
问题描述
我有一个用于展示从API服务获取的Dataset的DataGrid,当前该DataGrid会显示完整的数据集。但我希望仅展示指定列。设置AutoGenerateColumns="False"并添加要显示的列时,出现错误:System.InvalidOperationException: 'Items collection must be empty before using ItemsSource.',原因是程序运行前集合不应存在。同时我不想隐藏或删除Dataset中的列,请问应采用何种方法来显示所需列?
原XAML代码
<DataGrid ItemsSource="{Binding Dataset}" AutoGenerateColumns="False" > <DataGridTextColumn Header="A" Binding="{Binding a}"/> <DataGridTextColumn Header="B" Binding="{Binding b}"/> <DataGridTextColumn Header="D" Binding="{Binding d}"/> </DataGrid>
原Dataset处理代码
var Dataset = await _apiDataService.GetDataSet(); if (Dataset != null) { Dataset.Clear(); foreach (var item in Dataset) { Dataset.Add(item); } }
解决方案
1. 修正XAML列定义位置
错误的核心原因是列定义直接放在了DataGrid根节点下,DataGrid根节点默认对应Items集合(绑定数据集的条目容器),手动添加的列被误识别为DataGrid的子项,和ItemsSource绑定的数据集产生冲突。
正确的做法是将所有列定义放入<DataGrid.Columns>标签内部,这样就能明确指定要显示的列,且不会修改原Dataset的结构:
<DataGrid ItemsSource="{Binding Dataset}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="A" Binding="{Binding a}"/> <DataGridTextColumn Header="B" Binding="{Binding b}"/> <DataGridTextColumn Header="D" Binding="{Binding d}"/> </DataGrid.Columns> </DataGrid>
2. 修复Dataset处理逻辑
原代码存在逻辑错误:获取Dataset后立刻清空,再遍历空集合添加元素,最终Dataset还是空的。如果是要刷新数据,修改如下:
// 获取新的数据集 var newDataset = await _apiDataService.GetDataSet(); if (newDataset != null) { // 清空原有数据,添加新数据 Dataset.Clear(); foreach (var item in newDataset) { Dataset.Add(item); } }
如果你的Dataset是ObservableCollection<T>类型,且绑定属性实现了INotifyPropertyChanged,直接替换集合实例会更简洁高效:
// 直接替换数据集,自动触发UI更新 Dataset = await _apiDataService.GetDataSet();
内容的提问来源于stack exchange,提问作者Akav
相关产品推荐
相关产品推荐

