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, но вам все равно нужно сделать один и тот же экземпляр доступным в обоих классах. Не зная отношений между этими классами