INotifyPropertyChange事件和自定义PropertyDescriptor
本文关键字:PropertyDescriptor 自定义 事件 INotifyPropertyChange | 更新日期: 2023-09-27 18:30:01
我有一个简单的windows窗体应用程序,它使用绑定到我的自定义对象(MCO)的BindingList<>
的DataGridView
。
我还实现了一个自定义TypeDescriptor和一个自定义PropertyDescriptor,我根据MCO的类型注册它们,目的是提供有关DataGridView的更多信息,而不是MCO的默认属性。自定义TypeDescriptor的PropertyDescriptorCollection返回父级的PropertyDescriptor(MCO的默认PropertyDescriptor)和一个自定义PropertyDescriptor。
一切都很好,当DataGridView
绑定到DataSource时,显示的列与从自定义TypeDescriptor返回的列相对应。
我还在MCO上实现了INotifyPropertyChanged,以便在MCO属性更改时刷新datagridview。然而,经过三天的互联网搜索和运行各种测试代码,我很难理解如何让自定义PropertyDescriptor也参与INotifyPropertyChanged事件。
举个例子,MCO看起来像这个
Public Class MyCustomObject : INotifyPropertyChanged
{
public int Property1 { get; set;}
//typical INotifyPropertyChanged implementation
}
然后,我通过TypeDescriptor.AddProvider()添加了一个自定义PropertyDescriptor"VirtualProperty2",它通过PropertyDescriptor的getter和setter映射到Property1。
当DatagridView
绑定时,它将Property1和VirtualProperty2显示为两列,并且单元格的值与预期的一样。
如果我然后通过-更改Property1的值
- 直接更新数据网格视图中的属性1单元格
- 直接更新datagridview中的VirtualProperty2单元格
- 单击表单上的按钮,该按钮通过代码更新MCO.Property1实例
Property1单元格将按预期刷新。但是,VirtualProperty2只会在条件2中发生更改。
如果在步骤1或3之后单击VirtualProperty2的单元格,它将更新。(因为单击单元格必须激发调用PropertyDescriptor上getter的事件)
不知怎的,当MCO中的Property1触发PropertyChanged事件时,我需要VirtualProperty1的PropertyDescriptor来响应它,因为实际上VirtualProperty1被映射到Property1。
想法?
在ICustomTypeDescriptor
实现中,确保缓存属性描述符。如果没有缓存,每次调用方法时都会得到新的未绑定实例。
public PropertyDescriptorCollection GetProperties()
{
if (propertyCache == null)
{
propertyCache = new PropertyDescriptorCollection(someProperties.ToArray<PropertyDescriptor>());
}
return propertyCache;
}