WPF DataGrid绑定列表后Items含数据但UI界面不显示
WPF DataGrid项已加入Items集合但UI不显示问题修复
问题相关信息
异常表现:列表项实际已被加入DataGrid.Items集合,但界面无对应渲染内容。
涉及控件XAML定义:
<DataGrid x:Name="DeviceListView" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding DeviceList}" Width="1403" />
后台数据源赋值代码:
DeviceListView.ItemsSource = DeviceList;
绑定的实体类定义:
class device { public string DeviceType { get; set; } public string devname { get; set; } public string Description { get; set; } }
运行环境:异常DataGrid属于WPF应用主窗口加载的视图模块。
修复步骤
- 移除重复的ItemsSource配置:XAML绑定和后台手动赋值两种方式只能保留一种。如果用后台代码赋值,直接删除XAML中的
ItemsSource="{Binding DeviceList}"属性;如果走MVVM绑定模式,删除后台DeviceListView.ItemsSource = DeviceList;代码,同时确保当前视图的DataContext正确赋值为持有DeviceList属性的实例,避免绑定失效。 - 替换集合为支持变更通知的类型:普通
List<T>不实现集合变更通知接口,在DataGrid首次渲染完成后再往List里加项,不会触发UI刷新,就会出现Items集合有值但界面空白的问题。将DeviceList的类型替换为ObservableCollection<T>即可,该类型内置集合变更通知逻辑,增删项时会自动触发UI重绘:// 需先引入命名空间 using System.Collections.ObjectModel; public ObservableCollection<device> DeviceList { get; set; } = new ObservableCollection<device>(); - 修正实体类访问级别:当前
device类未声明访问修饰符,默认为internal级别,在部分权限场景下DataGrid通过反射读取属性自动生成列会失败,给类添加public修饰符即可:public class device { public string DeviceType { get; set; } public string devname { get; set; } public string Description { get; set; } } - 排查布局异常:去掉DataGrid上固定
Width="1403"的硬编码,临时设置HorizontalAlignment="Stretch",同时检查父容器是否存在布局裁剪、高度为0等问题,排除控件本身不在可视区域的情况。 - 校验线程访问合法性:所有对
DeviceList的增删操作、ItemsSource赋值操作必须在UI主线程执行,如果是后台线程获取到数据需要更新集合,必须通过Dispatcher调度到UI线程执行,跨线程操作会导致UI渲染异常。
内容的提问来源于stack exchange,提问作者user14245614
相关产品推荐
相关产品推荐

