这似乎是一个从根本上简单的问题。我有一个带有列表框的 WinForms 对话框。此控件不是通过数据绑定填充的,而是填充了对
listBox.Items.Add (obj);
有可能这个调用可以从不同的地方异步进行,我想挂钩列表框并观察其数据成员的变化,以便我可以执行其他 UI 更改(例如启用或禁用与基于列表框交互的控件关于列表中的项目数)。
不幸的是,除非我完全一无所知,否则似乎没有一个事件或虚拟方法可以用来检测这一点。我可以挂钩选择更改,并且(对于 CheckedListBox)我可以挂钩检查状态更改。但不适用于对基础数据收集的更改。
我知道这在 Win32 中是可能的(有一个窗口消息)。我错过了什么?
[西蒙编辑]
解决方案
我被指出了正确的解决方案(我已将其标记为已接受的答案),即覆盖 ListBox 的 WndProc 方法并手动处理列表框消息。这是我确定(并且有效)的解决方案。可以对其进行修改以在事件中提供更多详细信息,或者将消息拆分为单独的事件,但对于我的需要,这已经足够了。
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 { };
}