1

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

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

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

我通过数据绑定将它绑定到我的列表框,我发现没有任何效果(listchanged 事件和 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");

4

3 回答 3

2

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

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


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

于 2011-05-25T07:53:02.713 回答
2

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

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

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

在您的情况下,与其尝试添加/编辑事件,不如在添加/修改/删除事件之后跟踪它们的初始状态。因此,如果该项目被删除,如果您从程序的开始状态开始跟踪,那么在您之前的状态下,您将拥有该项目。

于 2011-06-01T06:13:37.817 回答
2
  • 您的集合不会检测现有项目中的属性更改,因为它不会在将项目添加到集合时挂钩到项目的属性更改事件。

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

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

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

  • 我不认为框架中的任何东西都使用了 INotifyPropertyChanging,只有原始的 INotifyPropertyChanged。您可能想在 BindingList 上使用 Reflector 来查看挂钩是如何完成的,然后如果您的项目支持它,请尝试合并 INotifyPropertyChanging。

于 2011-06-01T10:09:47.417 回答