イベントハンドラー自体からイベントハンドラーへの参照を取得して、それを呼び出したイベントからフックを解除することはできますか?
たとえば、control.Loaded イベントが Lambda を指すようにしたいのですが、そうした場合、unhook (-=) 呼び出しに何を渡せばよいかわかりません。
コードの抜粋を次に示します。
private static void IsEnabled_Changed(object sender, DependencyPropertyChangedEventArgs e)
{
var control = (Control)sender;
if(control.IsLoaded)
WireUpScrollViewerEvents(control);
else
control.Loaded += Control_Loaded;
}
private static void Control_Loaded(object sender, RoutedEventArgs e)
{
var control = (Control)sender;
control.Loaded -= Control_Loaded; // <-- How can I do this from a lambda in IsEnabled_Changed?
WireUpScrollViewerEvents(control);
}
private static void WireUpScrollViewerEvents(Control control, bool attach)
{
var scrollViewer = Utils.FindFirstVisualChild<ScrollViewer>(control);
if(scrollViewer == null) return;
var attachEvents = GetIsEnabled(control);
if(attachEvents)
{
scrollViewer.PreviewDragEnter += ScrollViewer_PreviewDragEnter;
scrollViewer.PreviewDragOver += PreviewDragOver;
}
else
{
scrollViewer.PreviewDragEnter -= ScrollViewer_PreviewDragEnter;
scrollViewer.PreviewDragOver -= PreviewDragOver;
}
}
Control_Loaded が実際のメソッドである唯一の理由は、「control.Loaded -= Control_Loaded」行のためです。IsEnabled_Changed 呼び出し内から直接匿名ラムダを実行できるかどうか疑問に思っています。