c# - INotifyPropertyChange 事件和自定义 PropertyDescriptor

标签 c# binding inotifypropertychanged propertydescriptor

我有一个简单的 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 的值

  1. 直接更新 datagridview 中的 Property 1 单元格
  2. 直接更新 datagridview 中的 VirtualProperty2 单元格
  3. 单击表单上的按钮,通过代码更新 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/

相关文章:

c# - 发送HTTP header 后,服务器无法设置状态-ELMAH

silverlight - 如何在 Silverlight 中检测 SetBinding 成功或失败?

model - SAP UI5 oData模型的访问值(value)

c# - WPF + PostSharp’ed View 模型在一分钟内就卡住了

c# - asp网格中如何在表格的顶部添加新行

c# - IList<something> 构造函数参数和 AutoFixture

c# - 绑定(bind)内部绑定(bind) WPF

c# - INotifyPropertyChanged - 更改 PropertyName 没有效果

xaml - MVVM INotifyPropertyChanged无法正常工作

c# - 如何修复 'Specified class name ' WpfSample.MainWindow' doesn't match actual root instance type 'System.Windows.Window' 错误?