C # Событие Проходит / Bubble Up - PullRequest
4 голосов
/ 06 февраля 2010

Я подписываюсь на Event внутри class. Такие как

MainStation mainStation = StationFactory.GetMainStation();  
mainStation.FrequencyChanged += new EventArgs(MainStation_FrequencyChanged);

Мой MainStation класс вызывает событие при некотором условии, просто вызывая событие FrequencyChanged()

Проблема

Теперь у меня есть сценарий, где я должен создать SubStation из MainStation, который также является подклассом MainStation с некоторыми дополнительными функциями, и событие FrequencyChanged должно быть подписано как MainStation Подв. Рассмотрим код, указанный ниже:

public class MainStation
{
    public event EventHandler FrequencyChanged;
    public static SubStation CreateSubStation()
    {
        SubStation subStation = new SubStation();
        //here I want to pass/bubble FrequencyChanged event to SubStation
        subStation.FrequencyChanged = FrequencyChanged; //THIS IS WRONG
    }
}

Итог
Я хочу вызвать событие, на которое класс подписывается из другого класса, а также всплывающие события

Обновление
StationFactory создает MainStation, а событие FrequencyChanged в экземпляре MainStation устанавливается так, как определено в первом блоке кода.

Ответы [ 3 ]

7 голосов
/ 06 февраля 2010

Если FrequencyChanged относится не к MainStation, а скорее к Base, вам придется связать и выставить интересующее вас событие.

public class MainStation : Base
{
    public event EventHandler StationFrequencyChanged;

    public MainStation()
    {
        // ...

        this.FrequencyChanged += new EventHandler(MainStation_FrequencyChanged);
    }

    void MainStation_FrequencyChanged(object sender, EventArgs e)
    {
        if (StationFrequencyChanged != null)
            StationFrequencyChanged(sender, e);
    }

    public void GetEventsFrom(MainStation src)
    {
        //this is where you assign src events to your object
        this.StationFrequencyChanged = src.StationFrequencyChanged;
    }

    public static SubStation CreateSubStation(MainStation main)
    {
        SubStation subStation = new SubStation();

        //register events    
        subStation.GetEventsFrom(main);

        return subStation;
    } 
}

public class SubStation : MainStation
{

} 
0 голосов
/ 07 февраля 2010

Если ваш метод CreateSubStation не был статическим, то ваш код работал бы так, как ожидалось. (При условии, что обработчики событий на MainStation были настроены до того, как вы создали Substation ... что на самом деле не очень хороший дизайн, IMO.)

0 голосов
/ 06 февраля 2010

Если вам нужно что-то более гибкое, можно использовать WPF RoutedEvents.

Или реализуйте подобный подход вручную: организуйте объекты в дерево и напишите менеджер событий, который может направлять события вверх от узла дерева. Если иерархия дерева соответствует вашим потребностям, это будет более удобно и предсказуемо, чем пересылка каждого отдельного события в обработчик.

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