Это кажется принципиально простым вопросом. У меня есть диалоговое окно WinForms со списком. Этот элемент управления не заполнен привязкой данных, но заполнен вызовами
listBox.Items.Add (obj);
Возможно, что этот вызов может быть выполнен асинхронно из разных мест, и я хотел бы подключить список и наблюдать за изменениями в его элементах данных, чтобы я мог выполнять другие изменения пользовательского интерфейса (например, включать или отключать элементы управления, которые взаимодействуют с список на основе количества элементов в списке).
К сожалению, если я не полностью ничего не понимаю, кажется, что нет события или виртуального метода, который можно подключить, чтобы обнаружить это. Я могу подключиться для выбора изменений и (для CheckedListBox) я могу подключиться для изменений состояния проверки. Но не для изменений в базовом сборе данных.
Я знаю, что это возможно в Win32 (для этого есть сообщение в окне). Чего мне не хватает?
[Под редакцией Саймона]
Решение
Мне указали на правильное решение (которое я пометил как принятый ответ), которое заключается в переопределении метода 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 { };
}