Это похоже на принципиально простой вопрос. У меня есть диалоговое окно 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 { };
}