C# 编辑并触发列表的PropertyValueChanged事件<;字符串>;在不动产网格中

C# 编辑并触发列表的PropertyValueChanged事件<;字符串>;在不动产网格中,c#,winforms,C#,Winforms,我试图用PropertyGrid编辑一个列表,当它的内容被修改时,它不会触发PropertyValueChanged事件 我对此进行了研究,并尝试使用自定义的TypeConverter类,但即使我让编辑器显示并允许我修改值,我也无法触发此事件 我还尝试使用下面的属性,它会调出字符串编辑器,但这也不会在更改时触发事件 [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=1.0.500

我试图用PropertyGrid编辑一个
列表
,当它的内容被修改时,它不会触发PropertyValueChanged事件

我对此进行了研究,并尝试使用自定义的
TypeConverter
类,但即使我让编辑器显示并允许我修改值,我也无法触发此事件

我还尝试使用下面的属性,它会调出字符串编辑器,但这也不会在更改时触发事件

[Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
    "System.Drawing.Design.UITypeEditor, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
我还尝试使用
UITypeEditor
并重写
EditValue
方法,但在编辑值时,这不会触发

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
  MessageBox.Show("This never appears...");
  return base.EditValue(context, provider, value);
}

有没有办法编辑
列表
并触发PropertyValueChanged事件?

您应该使用
绑定列表
而不是
列表
来触发
PropertyValueChanged
事件

编辑:

@LarsTech指出,
ObservableCollection
实际上用于WPF,而不是winforms,您应该使用
BindingList

简而言之,
BindingList
observedcollection
支持更多的接口和功能。以下是使用BindingList的一些优点:

  • BindingList
    实现了
    IBindingList
    ,但
    observedcollection
    没有实现
    IBindingList
    提供了一整套功能,用户界面可以使用这些功能提供更多信息,请查看更多详细信息
  • BindingList
    实现数据绑定机制用于取消新添加项的
    ICancelAddNew
  • observedcollection
    不监听其子项中的更改,而只监听
    插入
    删除
    事件

第2点和第3点完全归功于:

正如langstrom所述,BindingList不会触发事件PropertyValueChanged

我使用了一个简单而难看的解决方法:在调整后,我设置了完整的集合(它只有几个项目):

CollectionValue=CollectionValue

(我的目标是,如果IDataErrorInfo为已编辑的属性提供了一些错误,则为(字符串的)ObservableCollection在自定义PropertyGrid编辑器周围获得一个红色边框。)

也看到

(讨论)


(发出通知单)

如果在使用PropertyGrid修改值后绑定列表未刷新,则可以调用BindingList.ResetBindings()来触发更改。

是否尝试过以下操作:[PropertyGrid不引发PropertyValueChanged事件][1][1]:是,当通过PropertyGrid更改属性时,这不会调用事件。在WinForms中,通常使用BindingList。这最终对我有效。我订阅了
BindingList
ListChanged
事件。此事件触发的次数比列表中的项数多一次,因此我必须对此进行说明。不完全是我想要的,但这让我振作起来。谢谢编辑:而且,这不会触发
属性value changed
,至少我看不出来。