Событие всегда пустое, поэтому не может быть обработано - PullRequest
0 голосов
/ 17 января 2019

У меня есть 3 класса, один класс вызывает событие, другой вызывает отправителя обработчика события и, наконец, последний получает событие.Однако обработчик события в классе отправителя всегда равен null, поэтому получатель никогда не обрабатывает событие.Я не могу понять, почему это null, поскольку я назначаю его как StartEventHandler, как показано ниже.

Я попытался ввести операторы отладки, чтобы понять, почему обработчик никогда не запускался, и обнаружил, что он никогдапопадает в класс С.

Первый класс вызывает событие:

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");
    }
}

Может кто-нибудь сказать мне, почему PageSwap в class B всегда null, следовательно, никогда не работает PageSwap(this, e).

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Проблема с вашим кодом заключается в том, что вы создаете два экземпляра класса B. В A вы пытаетесь вызвать событие для одного экземпляра B. В C вы пытаетесь обработать событие, вызванное , используя экземпляр разности B.

Кажется, что вы пытались сделать правильную вещь, создав Connect метод в C, но именно здесь должен передать существующий экземпляр B до C.

Если бы вы написали свой код так, он бы работал:

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");
    }
}
0 голосов
/ 17 января 2019

C.Connect() не вызывается, и это необходимо, поскольку именно здесь вы регистрируете EventHandler, который вызывает this.sender_PageSwap. Без этого ничего не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...