WPF MVVM中DataGrid绑定DataTable时Rows.List为空 行不显示问题
问题根因与解决方案
首先纠正一个排错误区:DataRowCollection.List 是.NET内部非公开属性,调试器中显示为空属于正常现象,和你DataGrid不显示数据没有关联,只要MapDataTable.Rows.Count数值正确,行数据就已经成功存入DataTable了。
你遇到的绑定不生效问题,核心原因是以下几个常见问题:
1. 未正确触发属性变更通知
MVVM模式下绑定的属性需要实现INotifyPropertyChanged通知,你代码末尾尝试重置MapDataTable强制刷新绑定的操作,因为没有走属性通知逻辑所以完全无效。
修正方案:
首先确保ViewModel中的MapDataTable属性定义包含通知逻辑:
private DataTable _mapDataTable; public DataTable MapDataTable { get => _mapDataTable; set => SetProperty(ref _mapDataTable, value); }
填充数据时不需要做"赋值null再赋值回来"的冗余操作,两种刷新方式二选一即可:
- 方式一:每次填充数据都新建DataTable,直接赋值给
MapDataTable属性,自动触发通知 - 方式二:复用原有DataTable,清空行后填充新数据,填充完成调用
MapDataTable.DefaultView.Refresh()手动刷新视图
2. 跨线程操作未封送UI线程
如果你是在后台异步线程中填充DataTable,那么DataTable的变更通知不会自动同步到UI线程,导致界面看不到更新。
修正方案:
将刷新绑定的操作封送到UI线程执行,WPF中使用Dispatcher处理:
Application.Current.Dispatcher.Invoke(() => { // 赋值MapDataTable或者调用DefaultView.Refresh()的逻辑放这里 });
3. RowFilter使用注意项
虽然你确认过滤表达式正确,但仍需要注意特殊字符转义问题:如果用户输入的FilterName包含单引号,会导致RowFilter语法报错,视图返回0条数据。建议对输入值做转义处理:
MapDataTable.DefaultView.RowFilter = $"Name LIKE '%{FilterName.Replace("'", "''")}%'";
额外排查点
- 检查
Map_AutoGeneratingColumn事件逻辑,确认没有误写e.Cancel = true取消所有列生成 - 确认DataGrid的DataContext已经正确绑定到你的ViewModel实例
- 调试时查看
MapDataTable.DefaultView.Count数值,如果为0说明过滤条件生效过滤了所有行,和数据填充逻辑无关
内容的提问来源于stack exchange,提问作者user17022636
相关产品推荐
相关产品推荐

