使用LiveBinding监控列表

时间:2011-09-13 08:27:46

标签: delphi list delphi-xe2 livebindings

我一直在尝试找到一种泛型方式来通知UI控件列表中的更改。例如,当一个对象被添加到列表中时,我希望它自动添加到列表框中。如果从列表中删除了一个对象,我希望它从列表框中自动删除。

不幸的是,Delphi的列表之间存在一些令人抓狂的不一致:TList<> .Notify很好,但TStringList.OnChange甚至没有告诉你改变是什么,TList甚至没有任何通知!

我希望LiveBindings会给我一个监控大多数列表更改的正确方法,但到目前为止我还没有看到它。我看到的所有示例都填充了控件并设置了列表项和控件项之间的绑定(我的示例中的列表框项)。但是从列表中添加/删除对象根本不会影响控件。

有没有人知道我错过了一种机制,或者更普遍的是,这是一种很好的通用方法吗?

澄清: 我之前似乎并不清楚。我需要通用方法的原因是因为我编写了一个可以连接到各种源的网格控件,包括一些现有代码。我编写了一个接口,网格接受它作为源,然后是一些适配器类来接受一些列表并使它们作为该接口可用。由于我也需要接受现有代码,因此不能覆盖TList.Notify。并且由于没有事件可以看到更改,因此它实际上意味着TList没有可由客户端使用的通知机制,例如我的适配器类。 TStrings也没有,但是TStringList引发了一个简单的OnChange,这意味着适配器类实际上无法确定改变了什么。

我实际上有一个使用TVirtualMethodInterceptor的非常好的解决方案,但是它完全停止在Delphi XE中工作,并且在XE2中没有修复。

2 个答案:

答案 0 :(得分:3)

您错过了TList.Notify机制。

TList有一个必须覆盖的受保护Notify程序。这是TObjectList的工作方式。

答案 1 :(得分:0)

迟到的答案,但通用TList有一个OnNotify,包括添加或删除的项目。