WinForms:如果添加带有“Changed”后缀的事件,为什么数据绑定会中断?

问题描述

一个带有名为“RelatedPrograms”的公共数据表变量的模型类。它通过数据绑定用作 UserControl 类中 DataGridView 控件的源:

dataGridView.DataBindings.Add("DataSource",Model,nameof(Model.RelatedPrograms),false,DataSourceUpdateMode.OnPropertyChanged);

现在,如果我向 Model 类引入一个名为“RelatedProgramsChanged”的新事件字段

public event EventHandler<EventArgs> RelatedProgramsChanged;

数据绑定停止工作,DataGridView 不会被来自 DataTable 的数据刷新。但是列显示正确。这是什么原因造成的?只要变量不以 -Changed 结尾且未定义为事件,一切都会正常运行。

解决方法

如果您正在定义 RelatedProgramsChanged,您还应该在属性值更改时触发该事件。您没有展示足够的代码来查明实现中的故障点。

PropertyNameChanged 事件是在引入 INotifyPropertyChanged Interface 之前发出更改信号的方式。有关详细信息,请参阅:Property-Changed Events

来自 INotifyPropertyChanged 的​​ Remarks 部分:

对于在绑定客户端之间的绑定中发生的更改通知 和数据源,您的绑定类型应该:

  • 实现 INotifyPropertyChanged 接口(首选)。

  • 为绑定类型的每个属性提供一个更改事件。

不要两者都做。

此事件以及 ShouldSerializePropertyName 和 ResetPropertyName(请参阅:Defining Default Values with the ShouldSerialize and Reset Methods)方法由 WinForm 绑定机制使用的属性描述符检索。您可以在 ReflectPropertyDescriptor 检查属性描述符代码并阅读评论以了解更多信息。