我遇到这样一种情况,我需要知道何时将在集合中添加/删除/修改一个项目。
我尝试在将触发这些事件的类中继承 BindingList,但是“添加”事件不起作用。我发现它工作的唯一方法是覆盖 EndNew() 方法,但是我没有找到一种方法来获取要在此方法中添加哪个对象(如果有人对此有解决方案,那也没关系!)。
因此构建了一个全新的类,它继承自 BindingList 的相同接口(interface)/类并实现了所有内容(但我没有继承 ICancelAddNew)。
我通过数据绑定(bind)将它绑定(bind)到我的列表框,但我发现没有任何效果(listchanged 事件和 listchanging 事件)。如何模拟列表框上的 BindingList 行为?
非常感谢任何建议,我没有任何其他解决方法的想法
编辑 1:
这是我的收藏:http://pastie.org/1978601 这就是我将集合绑定(bind)到 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");
请您参考如下方法:
您的集合不会检测现有项目的属性更改,因为它不会在项目添加到集合时 Hook 到项目的属性更改事件。
BindingList<T>确实在您的项目上监听 PropertyChanged 并在将项目添加到 BindingList 时触发 ListChanged 事件并且它确实包含添加的索引。在没有 WinForms 的测试应用中试用它。添加现有项目与 AddNew() 不同。只有在调用 AddNew() 时才会调用 AddingNew 事件,并允许您提供新实例。
当涉及 WinForms 时,事情会变得更加复杂。需要考虑 CurrencyManager 和 BindingSource。如果根本没有事件触发,则检查您是否正在使用您认为的 CurrencyManager/BindingSource。
我认为框架中没有任何东西使用 INotifyPropertyChanging,只有原始的 INotifyPropertyChanged。您可能想在 BindingList 上使用 Reflector 来查看 Hook 是如何完成的,然后尝试合并 INotifyPropertyChanging(如果您的项目支持它)。
