C# 创建一个自定义集合,如BindingList,该集合与ListBox一起使用,以创建ListChanged事件
我有一种情况,我需要知道某个项目何时将在集合中添加/删除/修改 我尝试在一个将触发这些事件的类中继承BindingList,但是“添加”事件不起作用。我发现它工作的唯一方法是重写EndNew()方法,但是我找不到一种方法来获取要在该方法中添加的对象(如果有人对此有解决方案,也可以!) 因此,构建了一个全新的类,该类继承自BindingList的相同接口/类,并实现了所有内容(但我没有继承ICancelAddNew) 我通过数据绑定将它绑定到我的listbox,发现什么都不起作用(listchanged事件和listchanged事件)。如何在listbox上模拟BindingList行为 非常感谢任何建议,我没有任何其他解决方法的想法 编辑1: 这是我的收藏: 这就是我如何将集合绑定到列表框的方法C# 创建一个自定义集合,如BindingList,该集合与ListBox一起使用,以创建ListChanged事件,c#,data-binding,listbox,bindinglist,C#,Data Binding,Listbox,Bindinglist,我有一种情况,我需要知道某个项目何时将在集合中添加/删除/修改 我尝试在一个将触发这些事件的类中继承BindingList,但是“添加”事件不起作用。我发现它工作的唯一方法是重写EndNew()方法,但是我找不到一种方法来获取要在该方法中添加的对象(如果有人对此有解决方案,也可以!) 因此,构建了一个全新的类,该类继承自BindingList的相同接口/类,并实现了所有内容(但我没有继承ICancelAddNew) 我通过数据绑定将它绑定到我的listbox,发现什么都不起作用(listchan
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”) 您是否遵循MSDN指南?您的集合类应该扩展
CollectionBase
并实现IBindingList
——这应该很好
此外,您可能希望集合项实现IEditableObject
,以支持*编辑
操作。但这不是必需的-更重要的是,您的集合项应该有一种在父集合发生更改时通知父集合的方法(通过遵循MSDN上提供的代码,或者使用例如)
您可以在文档页上找到实现自定义
CustomersList
的工作绑定示例(Customer
类可以在文档页上找到)。您是否遵循了MSDN指南?您的集合类应该扩展CollectionBase
并实现IBindingList
——这应该很好
此外,您可能希望集合项实现IEditableObject
,以支持*编辑
操作。但这不是必需的-更重要的是,您的集合项应该有一种在父集合发生更改时通知父集合的方法(通过遵循MSDN上提供的代码,或者使用例如)
您可以在文档页面上找到实现自定义
CustomersList
的工作绑定示例(Customer
类可以在文档页面上找到)。在清楚了解您要查找的内容后,我将建议以下事项
这是一个很棒的撤销框架,它提供了很多功能。
这是样品,
在您的情况下,如果存储了添加/修改/删除的事件的初始状态,则最好在添加/修改/删除事件之后进行跟踪,而不是尝试挂接添加/编辑事件。因此,如果项目已删除,则在以前的状态下,如果从程序的开始状态开始跟踪,则项目已存在 在弄清楚你要找的是什么之后,我会建议你做以下几件事 这是一个很棒的撤销框架,它提供了很多功能。 这是样品, 在您的情况下,如果存储了添加/修改/删除的事件的初始状态,则最好在添加/修改/删除事件之后进行跟踪,而不是尝试挂接添加/编辑事件。因此,如果项目已删除,则在以前的状态下,如果从程序的开始状态开始跟踪,则项目已存在
- 您的集合不会检测到现有项中的属性更改,因为在将项添加到集合中时,它不会挂接到项的属性更改事件中
会侦听项上的PropertyChanged,并在将项添加到BindingList时触发ListChanged事件,并且该事件包含添加的索引。在没有WinForms的测试应用程序中尝试BindingList
- 添加现有项与添加新项()不同。AddingNew事件仅在调用AddNew()时调用,并允许您提供新实例
- 当涉及WinForms时,事情会变得更加复杂。有CurrencyManager需要考虑,还有BindingSource。如果根本没有触发任何事件,请检查您是否正在使用您认为是的CurrencyManager/BindingSource
- 我认为框架中没有任何东西使用INotifyPropertyChanged,只有原始的INotifyPropertyChanged。您可能希望使用BindingList上的Reflector查看挂钩是如何完成的,然后尝试合并InotifyPropertyChange(如果您的项支持)
- 您的集合不会检测到现有项中的属性更改,因为在将项添加到集合中时,它不会挂接到项的属性更改事件中
会侦听项上的PropertyChanged,并在将项添加到BindingList时触发ListChanged事件,并且该事件包含添加的索引。在没有WinForms的测试应用程序中尝试BindingList
- 添加现有项与添加新项()不同。AddingNew事件仅在调用AddNew()时调用,并允许您提供新实例
- 当涉及WinForms时,事情会变得更加复杂。有CurrencyManager需要考虑,还有BindingSource。如果根本没有触发任何事件,请检查您是否正在使用您认为是的CurrencyManager/BindingSource
- 我认为框架中没有任何东西使用INotifyPropertyChanged,只有原始的INotifyPropertyChanged。您可能希望使用BindingList上的Reflector查看挂钩是如何完成的,然后尝试合并InotifyPropertyChange(如果您的项支持)