【发布时间】:2013-09-05 00:49:45
【问题描述】:
我有一个简单的 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 的值- 直接更新 datagridview 中的 Property 1 单元格
- 直接更新datagridview中的VirtualProperty2单元格
- 单击表单上的按钮,通过代码更新 MCO.Property1 实例
Property1 单元格将按预期刷新。但是 VirtualProperty2 只会在条件 2 中改变。
如果我在第 1 步或第 3 步之后单击 VirtualProperty2 的单元格,它将更新。 (因为单击单元格必须触发一个事件,该事件调用 PropertyDescriptor 上的 getter)
不知何故,当 MCO 中的 Propery1 触发 PropertyChanged 事件时,我需要 VirtualProperty1 的 PropertyDescriptor 来响应它,因为实际上 VirtualPropery1 已映射到 Property1。
想法?
【问题讨论】:
-
也许我会改写这个问题。如何添加自定义属性描述符并将其连接起来,以便从基础对象接收 INotifyPropertyChange 事件?
-
你的
Property1的二传手不能直接触发NotifyPropertyChanged("VirtualProperty1")吗?
标签: c# binding inotifypropertychanged propertydescriptor