C# - проблема с пользовательскими событиями повышения

У меня есть мой класс, где я определяю свое событие:

public class EventRaiserUtility
{
    public event EventHandler updateList;

    public void updateListEvent()
    {
        if (updateList != null)
        {
            updateList(this, EventArgs.Empty);
        }
    }
    public static EventRaiserUtility raiser = new EventRaiserUtility();
}

и вот где я поднимаю свое мероприятие:

EventRaiserUtility.raiser.updateListEvent();

и, наконец, это то, где я пытаюсь создать слушателя:

...
EventRaiserUtility.raiser.updateList += new EventHandler(raiser_updateList);
//placed in the init method of another class
...

private void raiser_updateList(object sender, EventArgs e)
{
    connType = MainWindowViewModel.getTTC();
}

Просто: это событие должно уведомить, когда список обновляется, а затем обновить другой список, с getTTC() с raiser_updateList,

Но raiser_updateList никогда не называется. Зачем? Все мои 3 фрагмента кода находятся в 3 разных классах (один и тот же проект), но это не проблема... верно?

3 ответа

Решение

Вы создаете новый EventRaiserUtility как раз перед тем как позвонить updateListEvent (который должен иметь заглавную U кстати, следовать соглашениям.NET; то же самое updateList => UpdateList) - но вы создаете отдельный EventRaiserUtility для того, чтобы подписаться на событие. Это разные объекты, поэтому есть разные подписчики на события. Если вы всегда создаете новый объект, прежде чем вызывать событие, у вас никогда не будет подписчиков.

Вы должны иметь один EventRaiserUtility хранится в переменной экземпляра в содержащем классе - вы создадите это в процессе конструирования, а затем подпишетесь на событие в одном месте, а в другом вызовете его... но потому, что они будут говорить об одном и том же EventRaiserUtility объект, вы не потеряете подписку.

(Не ясно, что этот служебный класс действительно имеет большую ценность, если честно - почему вы просто не объявляете событие в своем классе напрямую? И зачем объявлять свой собственный делегат, когда EventHandler имеет точно такую ​​же подпись?)

Насколько я вижу - вы подписываетесь на событие одного экземпляра EventRaiserUtility, но вызывает событие из другого экземпляра, у которого нет подписчиков

Вам нужен один объект, чтобы действительно владеть событием. Может быть, это EventRaiserUtility, но вам все равно нужно сделать один и тот же экземпляр доступным в обоих классах. Не зная отношений между этими классами

Другие вопросы по тегам