Уведомлять, когда запускается событие из другого класса

у меня есть

class A
{
    B b;

    //call this Method when b.Button_click or b.someMethod is launched
    private void MyMethod()
    {            
    }

    ??
}

Class B
{
    //here i.e. a button is pressed and in Class A 
    //i want to call also MyMethod() in Class A after the button is pressed 
    private void Button_Click(object o, EventArgs s)
    {
         SomeMethod();
    }

    public void SomeMethod()
    {           
    }

    ??
}

Класс A имеет экземпляр класса B.

Как это может быть сделано?


person Gobliins    schedule 13.12.2012    source источник
comment
Спасибо, ребята, за все ответы +1 ко всем   -  person Gobliins    schedule 13.12.2012


Ответы (3)


Вам нужно будет объявить публичное событие в классе «B» и подписаться на него в классе «A»:

Что-то вроде этого:

class B
{
    //A public event for listeners to subscribe to
    public event EventHandler SomethingHappened;

    private void Button_Click(object o, EventArgs s)
    {
        //Fire the event - notifying all subscribers
        if(SomethingHappened != null)
            SomethingHappened(this, null);
    }
....

class A
{
    //Where B is used - subscribe to it's public event
    public A()
    {
        B objectToSubscribeTo = new B();
        objectToSubscribeTo.SomethingHappened += HandleSomethingHappening;
    }

    public void HandleSomethingHappening(object sender, EventArgs e)
    {
        //Do something here
    }

....
person Dave Bish    schedule 13.12.2012
comment
Не знаю, почему так сложно найти пример события C #, такой же простой и понятный, как этот, просто для связи двух классов? После нескольких часов поисков, наконец... Я хочу плакать, большое спасибо. - person Konayuki; 29.05.2017
comment
@Konayuki: Не могу не согласиться. Я искал простой пример этого, и это он. (at)DaveBish: хорошая работа - простая и эффективная. - person Paul; 12.02.2018

Вам нужны три вещи (которые отмечены комментариями в коде):

  1. Объявить событие в классе B
  2. Поднимите событие в классе B, когда что-то произошло (в вашем случае - выполнен обработчик события Button_Click). Имейте в виду, что вам нужно проверить, есть ли какие-либо подписчики. В противном случае вы получите NullReferenceException при возникновении события.
  3. Подпишитесь на событие класса B. Вам нужно иметь экземпляр класса B, на который даже вы хотите подписаться (другой вариант - статические события, но эти события будут вызываться всеми экземплярами класса B).

Код:

class A
{
    B b;

    public A(B b)
    {
        this.b = b;
        // subscribe to event
        b.SomethingHappened += MyMethod;
    }

    private void MyMethod() { }
}

class B
{
    // declare event
    public event Action SomethingHappened;

    private void Button_Click(object o, EventArgs s)
    {
         // raise event
         if (SomethingHappened != null)
             SomethingHappened();

         SomeMethod();
    }

    public void SomeMethod() { }
}
person Sergey Berezovskiy    schedule 13.12.2012

Взгляните на повышение уровня события из класса B

Посмотри на

Вызов события

Обработка и вызов событий

Как создавать и использовать события

person Adriaan Stander    schedule 13.12.2012