これは根本的に単純な質問のように思えます。リストボックス付きの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 { };
}