Как вы поднимаете событие в C #? - PullRequest
2 голосов
/ 28 октября 2010

Класс загрузки данных запаса имеет BarList, к которому он либо добавляет новые столбцы, либо обновляет их и заменяет последний столбец, когда последний столбец изменяется в реальном времени. Всякий раз, когда этот класс загрузки добавляет новый бар в класс BarList или изменяет его последний бар, он также вызывает его NotifyOnBarsAdded или NotifyOnBarChanges. Я пытаюсь заставить методы notify вызывать события, чтобы класс Canvas, который обрабатывает эти события, мог перерисовать последний столбец или всю диаграмму в зависимости от того, какой метод notify вызывается. Проблема в том, что когда вызывается класс NotifyOnBarsAdded, я получаю исключение NullReferenceException при попытке вызвать событие. Я поднимаю событие так: NotifyBarAdded(this, EventArgs.Empty). Это неверно? Вот код:

public class BarList : List< Bar >
{
    private int historyHandle;
    public event EventHandler NotifyBarChanged;
    public event EventHandler NotifyBarAdded;

    public BarList(int historyHandle)
    {
        this.historyHandle = historyHandle;
    }

    public BarList()
    {
        // TODO: Complete member initialization
    }

    public void NotifyOnBarChange()
    {
        NotifyBarChanged(this,EventArgs.Empty);
    }

    public void NotifyOnBarsAdded()
    {
         NotifyBarAdded(this, EventArgs.Empty);
    }

    public long handle { get; set; }


}

Ответы [ 2 ]

5 голосов
/ 28 октября 2010

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

Проверка на ноль:

var local = NotifyBarAdded;
if(local != null) local(this, EventArgs.Empty);

Инициализация с пустым делегатом позволит вам сохранить вызовы, которые у вас уже есть (т.е. нет необходимости проверять на нулевое значение).

public event EventHandler NotifyBarAdded = delegate {};
2 голосов
/ 28 октября 2010

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

 public void NotifyOnBarChange()
    {   
        if (NotifyBarChanged != null)
                 NotifyBarChanged(this,EventArgs.Empty);
    }

Они возьмут ваш объект и вызовут что-то вроде:

yourObject.NotifyBarChanged  += ...their event handler ...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...