c# - 事件始终为 Null,因此无法处理

标签 c# class event-handling

我有 3 个类,一个类触发事件,另一个类调用事件处理程序发送者,最后一个类接收事件。然而,发送者类中的事件处理程序始终为 null,因此接收者永远不会处理该事件。我无法弄清楚为什么它是 null,因为我将它指定为 StartEventHandler,如下所示。

我已尝试输入调试语句以了解为什么处理程序从未运行并发现它永远不会进入 C 类。

头等舱触发事件:

Class A {
    public void Button_Click(object sender, RoutedEventArgs e)
    {            
        B senders = new B();
        senders.OnPageSwap(new StartEventArgs());
    }
}

第二类是发送者

public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
    public event StartEventHandler PageSwap;
    public virtual void OnPageSwap(StartEventArgs e)
    {
        Console.WriteLine("Entered PageSwapSender");
        if(PageSwap != null) PageSwap(this, e);
    }
}

第三类是接收者

Class C {
    B sender = new B();

    void Connect()
    {
        sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
        Console.WriteLine("Entered Connect");
    }

    private void sender_PageSwap(object sender, StartEventArgs e)
    {
        Console.WriteLine("Entered Handler");
    }
}

谁能告诉我为什么 class B 中的 PageSwap 总是 null 因此永远不会运行 PageSwap(this, e).

最佳答案

您的代码存在的问题是您正在实例化 B 类的两个独立实例。在 A 中,您试图在 B 的一个实例上引发事件。在 C 中,您正尝试使用 B 的不同实例处理引发的事件。

看来您已尝试通过在 C 中创建 Connect 方法来做正确的事情,但这是您应该传递现有实例的地方从 BC

如果您像这样编写代码,它会起作用:

class A
{   
    public void Button_Click(object sender, RoutedEventArgs e)
    {
        B senders = new B();
        C c = new C();
        c.Connect(senders);
        senders.OnPageSwap(new StartEventArgs());
    }
}

public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
    public event StartEventHandler PageSwap;
    public virtual void OnPageSwap(StartEventArgs e)
    {
        Console.WriteLine("Entered PageSwapSender");
        if (PageSwap != null) PageSwap(this, e);
    }
}

class C
{
    public void Connect(B sender)
    {
        sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
        Console.WriteLine("Entered Connect");
    }

    private void sender_PageSwap(object sender, StartEventArgs e)
    {
        Console.WriteLine("Entered Handler");
    }
}

关于c# - 事件始终为 Null,因此无法处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54229275/

相关文章:

javascript - 在 JavaScript 中使用 Array 对象在数组内部的实例上调用任意方法

c++ - 创建用户定义的复制构造函数时无法创建对象

c# - <>在C#中的意义

javascript - 为什么格式化输入字段会阻止 onChange 事件发生

java - 无法理解和解决此程序的方法覆盖错误

javascript - React 在接收到多个并发事件后如何重新渲染是否有明确定义的行为?

c# - 如何使用单个 'await Task.WhenAll' 简化多个等待?

c#时间计算

c# - 使用独立的 Blazor WASM、AAD、.NET Core 6 Web API 调用 MS Graph 时,On-Behalf-Of 流程出现问题

c# - Automapper:数组到对象的映射