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

时间:2011-05-24 02:22:02

标签: c# data-binding listbox bindinglist

我有一种情况,我需要知道什么时候 要在集合中添加/删除/修改。

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

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

我通过数据绑定将其绑定到我的列表框,我发现没有任何作用(listchanged事件既不列出事件)。如何模拟列表框上的BindingList行为?

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

编辑1:

这是我的收藏:http://pastie.org/1978601 这就是我将集合绑定到ListBox

的方法
        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”);

3 个答案:

答案 0 :(得分:2)

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

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


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

答案 1 :(得分:2)

在明确了解您所寻找的内容后,我会建议您遵循以下内容

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

以下是样本, http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

在您的情况下,如果您存储其初始状态,则最好在添加/修改/删除事件后跟踪添加/编辑事件。因此,如果项目已被删除,则在您之前的状态中,如果您从程序的开始状态开始跟踪,则您将拥有该项目。

答案 2 :(得分:1)

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

  • BindingList<T>会在您的商品上收听PropertyChanged,并在将商品添加到BindingList时触发ListChanged事件,并确实包含添加的索引。在没有WinForms的测试应用程序中试用它。

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

  • 当涉及WinForms时,事情变得更加复杂。有MoneyManager可以考虑,还有BindingSource。如果根本没有触发事件,那么检查您是否使用了您认为的CurrencyManager / BindingSource。

  • 我认为框架中的任何内容都不使用INotifyPropertyChanging,只使用原始的INotifyPropertyChanged。您可能希望在BindingList上使用Reflector来查看挂钩是如何完成的,然后在您的项目支持的情况下尝试合并INotifyPropertyChanging。