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

本文关键字:集合 创建 ListBox 一起 事件 ListChanging 一个 BindingList 自定义 | 更新日期: 2023-09-27 17:57:23

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

我尝试在将触发这些事件的类中继承 BindingList,但是"添加"事件不起作用。我发现它工作的唯一方法是覆盖 EndNew() 方法,但是我没有找到一种方法来获取将在此方法中添加哪个对象(如果有人对此有解决方案,那也没关系!

所以构建了一个全新的类,它继承了 BindingList 的相同接口/类并实现了所有内容(但是我没有继承 ICancelAddNew)。

通过数据绑定将其绑定到我的列表框,我发现没有任何效果(列表更改事件或列表更改事件)。如何在列表框上模拟绑定列表行为?

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

的想法

编辑 1:

这是我的收藏: http://pastie.org/1978601这就是我将集合绑定到列表框的方式

        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");

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

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

  • BindingList<T> 确实侦听项上的 PropertyChanged,并在将项添加到 BindingList 时触发 ListChanged 事件,并且它确实包含添加项的索引。在没有 WinForms 的测试应用中尝试一下。

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

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

  • 我不认为框架中的任何内容都使用INotifyPropertyChange,只有原始的INotifyPropertyChanged。您可能希望使用 BindingList 上的反射器来查看挂钩是如何完成的,然后尝试合并 INotifyPropertyChange(如果您的项支持它)。

您是否遵循了 MSDN 准则?集合类应该扩展CollectionBase并实现IBindingList - 这应该没问题。

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


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

在清楚地了解您正在寻找什么之后,我会建议遵循以下事项

这是一个很棒的撤消框架,它提供了许多功能。http://undo.codeplex.com/

这是示例,http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

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