一个事件处理程序可以不经反射就自引
可能重复:
在C#中取消订阅匿名方法
单发事件订阅
是否有可能从事件处理程序本身中获取对事件处理程序的引用,以便您可以从调用它的事件中解除它的作用?
例如,我很乐意将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调用lambda中移除它。
好的,找到了。
好的,找到了。 我无法工作的原因是我正在这样做......
RoutedEventHandler Control_Loaded = (s2, e2) =>
{
control.Loaded -= Control_Loaded;
WireUpScrollViewerEvents(control);
};
......当我应该这样做的时候......
RoutedEventHandler Control_Loaded = null; // <-- It's now declared before it's set, which is what we need
Control_Loaded = (s2, e2) =>
{
control.Loaded -= Control_Loaded;
WireUpScrollViewerEvents(control);
};
这是因为你必须在使用它之前实际声明变量,并且我试图将它用作声明的一部分。 这解决了这个问题。
链接地址: http://www.djcxy.com/p/51473.html上一篇: Can an event handler refer to itself without reflection?