我一直在尝试找到一种通用方法来通知 UI 控件列表中的更改。例如,当一个对象被添加到列表中时,我希望它自动添加到列表框中。如果从列表中删除了一个对象,我希望它自动从列表框中删除。
不幸的是,Delphi 的列表之间存在一些令人发狂的不一致: TList<>.Notify 很好,但 TStringList.OnChange 甚至没有告诉您更改是什么,而且 TList 甚至没有任何通知!
我希望 LiveBindings 能给我一个适当的方法来监控大多数列表中的变化,但到目前为止我还没有看到它。我见过的所有示例都填充了控件并在列表项和控件项(在我的示例中为列表框项)之间设置了绑定。但是从列表中添加/删除对象根本不会影响控件。
有谁知道我错过的一种机制,或者更一般地说,一种很好的通用方式来做到这一点?
澄清: 我之前好像还不够清楚。我需要一种通用方式的原因是因为我编写了一个网格控件,它可以连接到各种源,包括一些现有的代码。我编写了一个网格接受作为源的接口,然后编写了一些适配器类来接受一些列表并使它们作为该接口可用。由于我也需要接受现有代码,因此无法覆盖 TList.Notify。而且由于没有事件可以看到更改,这实际上意味着 TList 没有客户端可用的通知机制,例如我的适配器类。TStrings 也没有,但 TStringList 引发了一个简单的 OnChange,这意味着适配器类实际上无法确定发生了什么变化。
实际上,我有一个非常好的解决方案,它使用了TVirtualMethodInterceptor,但是在 Delphi XE 中完全停止了工作,并且在 XE2 中没有修复。