我有一个简单的Windows窗体应用程序,它使用绑定到DataGridView
自定义对象(MCO)的BindingList<>
。
我还实现了一个自定义TypeDescriptor和一个自定义PropertyDescriptor,我根据MCO的类型注册,以便提供有关DataGridView的更多信息,而不是MCO的默认属性。 自定义TypeDescriptor的PropertyDescriptorCollection从父级(MCO的默认PropertyDescriptors)和一个自定义PropertyDescriptor返回PropertyDescriptors。
一切都很好,当DataGridView
绑定到DataSource时,显示的列对应于从自定义TypeDescriptor返回的列。
我还在MCO上实现了INotifyPropertyChanged,以便在更改MCO属性时刷新datagridview。 然而,经过三天的互联网搜索和运行各种测试代码后,我很难理解如何让自定义PropertyDescriptor也参与INotifyPropertyChanged事件。
作为一个例子,说MCO看起来像这样
Public Class MyCustomObject : INotifyPropertyChanged
{
public int Property1 { get; set;}
//typical INotifyPropertyChanged implementation
}
然后我通过TypeDescriptor.AddProvider()添加一个Custom PropertyDescriptor“VirtualProperty2”,它通过PropertyDescriptor的getter和setter映射到Property1。
当DatagridView
绑定时,它会将Property1和VirtualProperty2显示为两列,并且单元格的值与预期一致。
如果我然后通过 -
更改Property1的值Property1单元格将按预期刷新。但VirtualProperty2只会通过条件2进行更改。
如果在步骤1或3之后单击VirtualProperty2的单元格,它将更新。 (因为单击单元格必须触发一个在PropertyDescriptor上调用getter的事件)
不知何故,当MCO中的Propery1触发它时,我需要PropertyProcriptor for VirtualProperty1来响应PropertyChanged事件,因为实际上VirtualPropery1被映射到Property1。
想法?