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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:45:35