【问题标题】:Create a custom collection like BindingList that works with ListBox to create a ListChanging event创建一个自定义集合,如 BindingList,与 ListBox 一起创建 ListChanging 事件
【发布时间】:2011-08-31 14:20:28
【问题描述】:

我需要知道何时打算在集合中添加/删除/修改项目。

我尝试在将触发这些事件的类中继承 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");

【问题讨论】:

  • 也许您应该发布更多关于“为什么”您想知道何时添加/删除/修改项目?因为如果您想在此之前阻止某些 UI 操作,那么您可以设置某种事件或绑定以在某些活动正在处理时禁用添加/删除/修改操作。
  • 我想做的是将每个属性的“先前值”存储在一个列表中,更改为一个 BindingList 项,因为我想将它用于类似于 Ctrl + Z 的东西跨度>
  • 因此,简单地说,您希望应用程序具有撤消/重做功能吗?然后您可能需要更改许多内容,因为属性和集合中的每个更改都需要存储为可以应用或删除的工作单元。有一些 codeplex 项目提供了一些框架来实现 Undo/Redo。
  • 好吧,我不会使用 Memento 方法,但我想使用 Command 方法,这就是为什么我更喜欢检测变化而不是变化的事件

标签: c# data-binding listbox bindinglist


【解决方案1】:
  • 您的集合不会检测现有项目的属性更改,因为它不会在将项目添加到集合时挂钩到项目的属性更改事件。

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

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

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

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

【讨论】:

  • 好的,虽然您的回答涉及很多事情,但重要的是第一个:我的收藏没有挂钩事件。但是,我认为 CollectionBase 会为我处理这个问题。我显然错了。现在它以这种方式工作。
【解决方案2】:

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

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

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

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

【讨论】:

  • 正如我在答案中所写,我更喜欢命令模式方法而不是备忘录方法,这就是为什么我需要跟踪不断变化的事件并且我设法让它发挥作用。
【解决方案3】:

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

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


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

【讨论】:

  • 感谢您的回答,我正在测试。我会给你这方面的消息,再次感谢。
  • @Fire-Dragon-DoL:你能发布一些代码吗,特别是。 Add 您集合中的方法以及您如何绑定到控件..?
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2014-06-14
相关资源
最近更新 更多