2014-10-10 3 views
0

У меня есть класс, где я определяю свое событие: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 разных классах (один и тот же проект), но это не проблема ... правильно?

+0

Вы не должны редактировать свой вопрос, чтобы включить предлагаемые решения, чтобы люди могли видеть исходную проблему и решения. –

ответ

5

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

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

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

+0

Я редактировал код с советами о моем делегате. Но как я могу ссылаться на тот же экземпляр события, если я нахожусь в разных классах? Как можно увидеть экземпляр от другого? (извините за тупой вопрос, я новичок в управлении событиями) –

+1

@PieroAlberto: Точно так же вы сохранили бы любую другую информацию. В принципе, мы почти не знаем, что вы пытаетесь сделать, если честно, но вам нужен один объект, чтобы действительно владеть этим событием. Возможно, это * - это 'EventRaiserUtility', но вам все равно нужно сделать тот же экземпляр доступным в обоих классах. Не зная отношений между этими классами, трудно помочь :( –

+0

Я сделал это, благодаря вашим советам. Послушайте, я снова редактировал код, теперь он работает! :) –

3

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

+0

Как я могу ссылаться на один и тот же экземпляр события, если я в разных классах? Как можно увидеть экземпляр от другого? (извините за тупой вопрос, я новичок в управлении событиями) –

+0

@PieroAlberto Кратко - вы можете переместить событие 'updateList' в класс 'first', где вы его поднимаете, и 'второй' класс, который обрабатывает событие должен подписаться на это событие из экземпляра класса first. В этом случае вы можете обнаружить, что ваш «EventRaiserUtility» является избыточным. –

0

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