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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:06:03