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. 直接更新数据网格视图中的属性1单元格
  2. 直接更新datagridview中的VirtualProperty2单元格
  3. 单击表单上的按钮,该按钮通过代码更新MCO.Property1实例

Property1单元格将按预期刷新。但是,VirtualProperty2只会在条件2中发生更改。

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

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

想法?

INotifyPropertyChange事件和自定义PropertyDescriptor

ICustomTypeDescriptor实现中,确保缓存属性描述符。如果没有缓存,每次调用方法时都会得到新的未绑定实例。

public PropertyDescriptorCollection GetProperties()
{
    if (propertyCache == null)
    {
        propertyCache = new PropertyDescriptorCollection(someProperties.ToArray<PropertyDescriptor>());
    }
    return propertyCache;
}
相关文章:
  • 没有找到相关文章