WinForm イベントから一時的に登録解除するためのきちんとした解決策を探しています。たとえば、次のイベント ハンドラーを持つ textBox1 コントロールがあるとします。
private void textBox1_TextChanged(object sender, EventArgs eventArgs)
{
// Do something
}
プログラムでテキスト ボックスの内容を変更するときに、このイベントが発生するのは望ましくありません。しかし、書く代わりに:
try
{
textBox1.TextChanged -= textBox1_TextChanged;
// Change textbox contents without triggering event
}
finally
{
textBox1.TextChanged += textBox1_TextChanged;
}
これに似たものを探しています:
using(new EventInhibitor(textBox1.TextChanged, textBox1_TextChanged))
{
// Change textbox contents without triggering event
}
問題は、textBox1.TextChanged イベントをコンストラクターに渡す方法です。反射?表現?
public class EventInhibitor : IDisposable
{
private bool _disposed = false;
private XXX _event;
private EventHandler _handler;
public EventInhibitor(XXX event, EventHandler handler)
{
_event = event;
_handler = handler;
_event -= _handler;
}
public void Dispose()
{
if(_disposed)
return:
_event += _handler;
_event = null;
_handler = null;
_disposed = true;
}
}