我有一个简单的windows窗体应用程序,它使用绑定到我的自定义对象(MCO)的DataGridView的BindingList<>。
我还实现了一个定制的TypeDescriptor和一个定制的PropertyDescriptor,我根据MCO的类型注册它们,目的是提供更多关于DataGridView的信息,而不是MCO的默认属性。自定义TypeDescriptor的PropertyDescriptorCollection从父类返回PropertyDescriptors (MCO的默认PropertyDescriptors )和一个自定义PropertyDescriptor。
一切正常,当DataGridView绑定到DataSource时,显示的列对应于自定义TypeDescriptor返回的列。
我还在MCO上实现了INotifyPropertyChanged,以便当MCO属性更改时数据视图将刷新。然而,在浏览了三天互联网,运行了各种测试代码之后,我很难理解如何让定制的PropertyDescriptor也参与INotifyPropertyChanged事件。
举个例子,MCO看起来像这样
Public Class MyCustomObject : INotifyPropertyChanged
{
public int Property1 { get; set;}
//typical INotifyPropertyChanged implementation
}然后通过PropertyDescriptor ()添加一个自定义VirtualProperty2,通过PropertyDescriptor的getter和setter映射到Property1。
当DatagridView绑定时,它将Property1和VirtualProperty2显示为两列,单元格的值与预期值相同。
如果我将Property1的值改为-
Property1单元将按预期刷新。但是,VirtualProperty2只会通过条件2进行更改。
如果在步骤1或3之后单击VirtualProperty2的单元格,它将更新。(因为单击单元格必须触发一个调用PropertyDescriptor上的getter的事件)
不知何故,我需要PropertyDescriptor for VirtualProperty1来响应MCO中的PropertyChanged事件,因为实际上VirtualPropery1是映射到Property1的。
想法?
发布于 2017-02-21 15:46:47
在ICustomTypeDescriptor实现中,请确保缓存属性描述符。如果没有缓存,每次调用该方法时,您都会得到新的--未绑定的实例。
public PropertyDescriptorCollection GetProperties()
{
if (propertyCache == null)
{
propertyCache = new PropertyDescriptorCollection(someProperties.ToArray<PropertyDescriptor>());
}
return propertyCache;
}https://stackoverflow.com/questions/18564270
复制相似问题