这似乎是一个根本上简单的问题。我有一个带有ListBox的WinForms对话框。该控件不是通过数据绑定填充的,而是通过调用进行填充。
listBox.Items.Add (obj);
这个调用可能可以从不同的位置异步进行,我想连接listbox并监视它的数据成员的更改,以便我可以执行其他UI更改(例如根据列表中项目的数量启用或禁用与列表框交互的控件)。
不幸的是,除非我完全不了解,否则似乎没有事件或虚拟方法可以挂钩以检测此类更改。我可以挂钩选择更改和(对于CheckedListBox)我可以挂钩检查状态更改。但不能检测到基础数据集合的更改。
我知道在Win32中这是可能的(有一个窗口消息可以实现此功能)。我缺少什么?
[由Simon编辑]
解决方案
我找到了正确的解决方案(我已将其标记为被接受的答案),即重写ListBox的WndProc方法,并手动处理listbox消息。这是我采用的解决方案(也有效)。可以修改它以在事件中提供更多细节,或将消息拆分为单独的事件,但对于我的需求,这已足够。
using System;
using System.Windows.Forms;
public class CheckedListBoxEx : CheckedListBox
{
public CheckedListBoxEx() { }
private const int LB_ADDSTRING = 0x180;
private const int LB_INSERTSTRING = 0x181;
private const int LB_DELETESTRING = 0x182;
private const int LB_RESETCONTENT = 0x184;
protected override void WndProc(ref Message m)
{
if (m.Msg == LB_ADDSTRING ||
m.Msg == LB_INSERTSTRING ||
m.Msg == LB_DELETESTRING ||
m.Msg == LB_RESETCONTENT)
{
ItemsChanged(this, EventArgs.Empty);
}
base.WndProc(ref m);
}
public event EventHandler ItemsChanged = delegate { };
}