我有一种情况,我需要知道什么时候 要在集合中添加/删除/修改。
我尝试通过在将触发这些事件的类中继承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”);
答案 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。