INotifyPropertyChange事件和Custom PropertyDescriptor

时间:2013-09-02 00:33:17

标签: c# binding inotifypropertychanged propertydescriptor

我有一个简单的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的值
  1. 直接更新datagridview中的Property 1单元格
  2. 直接更新datagridview中的VirtualProperty2单元格
  3. 单击表单上的按钮,通过代码
  4. 更新MCO.Property1实例

    Property1单元格将按预期刷新。但VirtualProperty2只会通过条件2进行更改。

    如果在步骤1或3之后单击VirtualProperty2的单元格,它将更新。 (因为单击单元格必须触发一个在PropertyDescriptor上调用getter的事件)

    不知何故,当MCO中的Propery1触发它时,我需要PropertyProcriptor for VirtualProperty1来响应PropertyChanged事件,因为实际上VirtualPropery1被映射到Property1。

    想法?

0 个答案:

没有答案