事件处理程序是否可以在没有反射的情况下引用自身



可能重复:
取消订阅C#中的匿名方法
单次事件订阅

是否可以从事件处理程序本身中获取对事件处理程序的引用,以便将其从调用它的事件中取消挂钩?

例如,我很想进行控制。加载的事件指向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_Loadd"行。我想知道我们是否可以直接在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);
};

这是因为在使用变量之前必须实际声明它,而我正试图将它作为声明的一部分。这就解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新