C# 创建一个自定义集合,如BindingList,该集合与ListBox一起使用,以创建ListChanged事件

C# 创建一个自定义集合,如BindingList,该集合与ListBox一起使用,以创建ListChanged事件,c#,data-binding,listbox,bindinglist,C#,Data Binding,Listbox,Bindinglist,我有一种情况,我需要知道某个项目何时将在集合中添加/删除/修改 我尝试在一个将触发这些事件的类中继承BindingList,但是“添加”事件不起作用。我发现它工作的唯一方法是重写EndNew()方法,但是我找不到一种方法来获取要在该方法中添加的对象(如果有人对此有解决方案,也可以!) 因此,构建了一个全新的类,该类继承自BindingList的相同接口/类,并实现了所有内容(但我没有继承ICancelAddNew) 我通过数据绑定将它绑定到我的listbox,发现什么都不起作用(listchan

我有一种情况,我需要知道某个项目何时将在集合中添加/删除/修改

我尝试在一个将触发这些事件的类中继承BindingList,但是“添加”事件不起作用。我发现它工作的唯一方法是重写EndNew()方法,但是我找不到一种方法来获取要在该方法中添加的对象(如果有人对此有解决方案,也可以!)

因此,构建了一个全新的类,该类继承自BindingList的相同接口/类,并实现了所有内容(但我没有继承ICancelAddNew)

我通过数据绑定将它绑定到我的listbox,发现什么都不起作用(listchanged事件和listchanged事件)。如何在listbox上模拟BindingList行为

非常感谢任何建议,我没有任何其他解决方法的想法

编辑1:

这是我的收藏: 这就是我如何将集合绑定到列表框的方法

        SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanged += new ListChangedEventHandler(ButtonsMacro_ListChanged);
        SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanging += new Expand.ComponentModel.ListChangingEventHandler(ButtonsMacro_ListChanging);
gumpButton.DataBindings.Add("Value", SpellCasterManager.CurrentProfile.ButtonsMacro, "GumpIndex", false, DataSourceUpdateMode.OnPropertyChanged);

实际上,订阅的事件中只有一个MessageBox.Show(“bla”)

您是否遵循MSDN指南?您的集合类应该扩展
CollectionBase
并实现
IBindingList
——这应该很好

此外,您可能希望集合项实现
IEditableObject
,以支持
*编辑
操作。但这不是必需的-更重要的是,您的集合项应该有一种在父集合发生更改时通知父集合的方法(通过遵循MSDN上提供的代码,或者使用例如)



您可以在文档页上找到实现自定义
CustomersList
的工作绑定示例(
Customer
类可以在文档页上找到)。

您是否遵循了MSDN指南?您的集合类应该扩展
CollectionBase
并实现
IBindingList
——这应该很好

此外,您可能希望集合项实现
IEditableObject
,以支持
*编辑
操作。但这不是必需的-更重要的是,您的集合项应该有一种在父集合发生更改时通知父集合的方法(通过遵循MSDN上提供的代码,或者使用例如)



您可以在文档页面上找到实现自定义
CustomersList
的工作绑定示例(
Customer
类可以在文档页面上找到)。

在清楚了解您要查找的内容后,我将建议以下事项

这是一个很棒的撤销框架,它提供了很多功能。

这是样品,


在您的情况下,如果存储了添加/修改/删除的事件的初始状态,则最好在添加/修改/删除事件之后进行跟踪,而不是尝试挂接添加/编辑事件。因此,如果项目已删除,则在以前的状态下,如果从程序的开始状态开始跟踪,则项目已存在

在弄清楚你要找的是什么之后,我会建议你做以下几件事

这是一个很棒的撤销框架,它提供了很多功能。

这是样品,

在您的情况下,如果存储了添加/修改/删除的事件的初始状态,则最好在添加/修改/删除事件之后进行跟踪,而不是尝试挂接添加/编辑事件。因此,如果项目已删除,则在以前的状态下,如果从程序的开始状态开始跟踪,则项目已存在

  • 您的集合不会检测到现有项中的属性更改,因为在将项添加到集合中时,它不会挂接到项的属性更改事件中

  • BindingList
    会侦听项上的PropertyChanged,并在将项添加到BindingList时触发ListChanged事件,并且该事件包含添加的索引。在没有WinForms的测试应用程序中尝试

  • 添加现有项与添加新项()不同。AddingNew事件仅在调用AddNew()时调用,并允许您提供新实例

  • 当涉及WinForms时,事情会变得更加复杂。有CurrencyManager需要考虑,还有BindingSource。如果根本没有触发任何事件,请检查您是否正在使用您认为是的CurrencyManager/BindingSource

  • 我认为框架中没有任何东西使用INotifyPropertyChanged,只有原始的INotifyPropertyChanged。您可能希望使用BindingList上的Reflector查看挂钩是如何完成的,然后尝试合并InotifyPropertyChange(如果您的项支持)

      • 您的集合不会检测到现有项中的属性更改,因为在将项添加到集合中时,它不会挂接到项的属性更改事件中

      • BindingList
        会侦听项上的PropertyChanged,并在将项添加到BindingList时触发ListChanged事件,并且该事件包含添加的索引。在没有WinForms的测试应用程序中尝试

      • 添加现有项与添加新项()不同。AddingNew事件仅在调用AddNew()时调用,并允许您提供新实例

      • 当涉及WinForms时,事情会变得更加复杂。有CurrencyManager需要考虑,还有BindingSource。如果根本没有触发任何事件,请检查您是否正在使用您认为是的CurrencyManager/BindingSource

      • 我认为框架中没有任何东西使用INotifyPropertyChanged,只有原始的INotifyPropertyChanged。您可能希望使用BindingList上的Reflector查看挂钩是如何完成的,然后尝试合并InotifyPropertyChange(如果您的项支持)


      谢谢你的回答,我正在测试。我会告诉你这方面的消息,再次感谢。@Fire Dragon-DoL:你能发布一些代码吗。