2011-05-24 68 views
1

我有一种情况,我需要知道什么时候项目是要在集合中添加/删除/修改创建一个像BindingList一样的自定义集合,它与ListBox一起创建一个ListChanging事件

我试图通过在将触发这些事件的类中继承BindingList,但“添加”事件不起作用。我发现它工作的唯一方法是通过重写EndNew()方法,但是我没有找到一种方法来获取哪个对象将被添加到这个方法(如果有人有这个解决方案,也没关系!)。因此构建了一个全新的类,该类继承自BindingList的相同接口/类并实现了一切(但我没有继承,但ICancelAddNew)。

我通过数据绑定将它绑定到我的列表框,并发现没有任何工作(listchanged事件既不listchanging事件)。如何模拟列表框上的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”);

+0

也许你应该张贴的东西更多关于“为什么”要知道,当一个项目将被添加/删除/修改?因为如果您想在此之前阻止某些UI操作,则可以设置某种事件或绑定来禁用添加/删除/修改操作,同时某些活动正在处理中。 – 2011-05-31 09:32:11

+0

我想要做的是将每个属性的“上一个值”存储到列表中,因为我想将它用于类似于Ctrl + Z的东西 – 2011-06-01 04:16:57

+0

因此,明确地说,您想要撤消/重做功能为您的应用程序?那么你可能不得不改变很多东西,因为属性和集合中的每一次更改都需要存储为可以应用或删除的工作单元。有一些codeplex项目提供了一些框架来实现Undo/Redo。 – 2011-06-01 06:05:53

回答

1
  • 您的集合将无法检测到现有项目中的属性更改,因为它在添加到集合时没有挂入项目的属性中更改的事件。

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

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

  • 当涉及到WinForms时,事情变得更加复杂。有CurrencyManager考虑和BindingSource。如果没有事件触发,请检查是否使用您认为自己的CurrencyManager/BindingSource。

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

+0

好的,虽然你的回答谈论很多事情,但重要的是第一个:我的收藏没有挂钩事件。不过,我认为CollectionBase会为我处理;我错了。现在它正在以这种方式工作。 – 2011-06-01 14:50:18

2

您是否遵循MSDN指南?你的收藏类应该延伸CollectionBase并执行IBindingList - 那应该没问题。

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


你可以找到工作IBindingList文档页面定制CustomersList实施结合样品(Customer类可以在IEditableObject文档页面中找到)。

+0

感谢您的回答,我正在测试。我会告诉你关于这方面的消息,再次感谢。 – 2011-05-26 12:15:38

+0

它不起作用,我的意思是,事件不会被解雇 – 2011-05-26 14:04:52

+0

@ Fire-Dragon-DoL:你能发表一些代码吗?从集合中添加''方法,以及如何绑定以控制..? – 2011-05-26 20:40:39

2

得到的您正在寻找我会建议以下几点

什么明确的想法后这里是一个伟大撤销框架,它提供了很多的功能。 http://undo.codeplex.com/

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

而在你的情况,而不是试图勾上添加/编辑的事件,它的更好,如果你保存它们的初始状态跟踪后添加/修改/删除的事件。因此,如果该项目被移除,则在之前的状态下,如果您从程序的开始状态开始跟踪,则已经有该项目。

+0

上发布代码正如我在答案中所写的,我更喜欢命令模式方法而不是记忆方法,这就是为什么我需要跟踪更改事件,并且我设法使其工作。 – 2011-06-01 14:51:16