根本原因是itemssource未绑定支持通知的集合(如observablecollection)或绑定路径错误,且person属性需为public自动属性并实现inotifypropertychanged,同时xaml中itemssource路径必须正确指向viewmodel中已初始化的public属性。

绑定集合时为什么DataGrid不显示数据
根本原因通常是 ItemsSource 没有指向一个支持通知的集合,或者绑定路径写错。WPF 的 DataGrid 不会自动刷新 UI,除非底层集合实现了 INotifyCollectionChanged(比如 ObservableCollection<t></t>),且每个属性都支持 INotifyPropertyChanged。
- 用
ObservableCollection<person></person>替代List<person></person>,否则新增/删除行不会反映在界面上 - 确保
Person类的属性是 public get/set 自动属性,或手动实现INotifyPropertyChanged;字段(public string Name;)无法被绑定识别 - 检查 XAML 中
ItemsSource="{Binding People}"的People是否在 DataContext 对应 ViewModel 的 public 属性中,且该属性在构造后已赋值(不是仅声明) - 启动调试时留意输出窗口是否有 “System.Windows.Data Error” —— 常见如
Property not found或Null reference,它会明确告诉你哪个路径失败
如何禁用自动生成列并手写 DataGridTemplateColumn
默认 AutoGenerateColumns="True" 会按属性名生成只读文本列,无法放按钮、下拉框或格式化显示。关掉它,才能完全控制每列行为。
- 在 XAML 中设
AutoGenerateColumns="False",然后显式定义DataGrid.Columns -
DataGridTextColumn适合纯文本展示/编辑,但不支持复杂控件;要放按钮、复选框、ComboBox,必须用DataGridTemplateColumn -
DataGridTemplateColumn.CellTemplate控制显示态(如TextBlock),CellEditingTemplate控制编辑态(如TextBox或ComboBox),二者可不同 - 模板内绑定使用
{Binding Path=Age}即可,不用加RelativeSource—— 每个单元格的DataContext默认就是对应数据项(如单个Person)
<datagridtemplatecolumn header="操作"><datagridtemplatecolumn.celltemplate><datatemplate><button content="删除" click="OnDeleteClick"></button>
</datatemplate></datagridtemplatecolumn.celltemplate></datagridtemplatecolumn>
SelectedItem 绑定失效或总是 null
常见于没设置 SelectionUnit="FullRow" 或忽略了 SelectionChanged 事件与属性更新的时机冲突。
-
SelectedItem是双向绑定,但必须确保目标属性类型与集合元素类型一致(如SelectedItem="{Binding SelectedPerson}",则SelectedPerson必须是Person类型,不能是object) - 如果代码中手动调用了
dataGrid.UnselectAll()或修改了ItemsSource,会清空SelectedItem,需同步重置绑定属性 - 避免在
SelectionChanged事件里直接改SelectedItem,容易引发循环赋值;优先用绑定,事件只做副作用(如加载详情) - 调试时可在 setter 中加断点:若从未进入,说明触发源不是 DataGrid 的选择动作(可能是绑定源被重置,或 DataContext 变了)
性能差、滚动卡顿,尤其数据量过千
DataGrid 默认启用虚拟化,但一旦破坏虚拟化条件(比如把 DataGrid 套进 ScrollViewer、或设了固定 Height 导致无法测量),就会渲染全部行,瞬间卡死。
- 确认外层没有包裹
ScrollViewer——DataGrid自带滚动条,嵌套会导致虚拟化失效 - 不要给
DataGrid设Height或MaxHeight(除非明确需要限制高度);让它按内容或父容器空间自然伸缩 - 关闭不必要的功能:设
EnableRowVirtualization="True"(默认 true,但显式写上更安心),VirtualizingStackPanel.VirtualizationMode="Recycling"可复用容器,减少 GC - 模板中避免写耗时逻辑(如在
CellTemplate里调用数据库或 IO);所有计算尽量前置到 ViewModel,绑定只读取现成值
DataContext,却以为是逻辑问题反复排查。动手前先看输出窗口,比猜半天快得多。










