我有一个简单的 Windows 窗体应用程序,它使用 DataGridView
绑定(bind)到 BindingList<>
我的自定义对象 (MCO)。
我还实现了一个自定义 TypeDescriptor 和一个自定义 PropertyDescriptor,我根据 MCO 的类型进行了注册,目的是提供有关 DataGridView 的更多信息,而不是 MCO 的默认属性。 自定义 TypeDescriptor 的 PropertyDescriptorCollection 从父级返回 PropertyDescriptors(MCO 的默认 PropertyDescriptors)和一个自定义 PropertyDescriptor。
一切都很好,当DataGridView
绑定(bind)到数据源,显示的列对应于从自定义 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
绑定(bind),它向我显示 Property1 和 VirtualProperty2 作为两列,并且单元格的值符合预期。
如果我然后通过 - 更改 Property1 的值
- 直接更新 datagridview 中的 Property 1 单元格
- 直接更新 datagridview 中的 VirtualProperty2 单元格
- 单击表单上的按钮,通过代码更新 MCO.Property1 实例
Property1 单元格将按预期刷新。然而,VirtualProperty2 只会通过条件 2 发生变化。
如果我在第 1 步或第 3 步之后单击 VirtualProperty2 的单元格,它将更新。 (因为单击单元格必须触发调用 PropertyDescriptor 上的 getter 的事件)
当 MCO 中的 Propery1 触发 PropertyChanged 事件时,我需要 VirtualProperty1 的 PropertyDescriptor 来响应它,因为实际上 VirtualPropery1 映射到 Property1。
想法?
最佳答案
在您的 ICustomTypeDescriptor
实现中,确保您缓存了属性描述符。如果没有缓存,您将在每次调用该方法时获得新的未绑定(bind)实例。
public PropertyDescriptorCollection GetProperties()
{
if (propertyCache == null)
{
propertyCache = new PropertyDescriptorCollection(someProperties.ToArray<PropertyDescriptor>());
}
return propertyCache;
}
关于c# - INotifyPropertyChange 事件和自定义 PropertyDescriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564270/