Определите Eventhandler с EventArgs и Event для работы в нескольких классах

У меня есть мой обычай EventArgs в отдельном файле класса, который я могу ссылаться на него позже из разных классов:

using System;
using System.Collections.Generic;

namespace SplitView
{
    public class RowSelectedEventArgs:EventArgs {
        public Patient selectedRow { get; set; }

        public RowSelectedEventArgs(Patient selectedRow) : base(){
            this.selectedRow = selectedRow;
        }
    }
}

В моем MasterViewController я определил мое событие

public event EventHandler<RowSelectedEventArgs> RowClicked;

В DataSource, который находится в MasterViewController, я могу вызвать событие:

if (this.controller.RowClicked != null) {
    this.controller.RowClicked (this, new RowSelectedEventArgs (this.controller.list [indexPath.Row]));
}

Как вы можете видеть, у меня есть источник (контроллер) в моем источнике данных, с которым я ссылаюсь на событие. Теперь у меня есть SearchSource с той же концепцией (также поле, называемое контроллером). Теперь в SearchSource я хочу поднять событие:

if (this.controller.RowClicked != null) {
    this.controller.RowClicked (this, new RowSelectedEventArgs (this.list [indexPath.Row]));
}

Но я получаю

Событие "SplitView.MasterViewController.RowClicked" может появляться только в левой части += или -= при использовании вне типа "SplitView.MasterViewController".

Единственное отличие состоит в том, что SearchSource не является частью класса MasterViewController (как это происходит с DataSource). Но событие public так должно работать?

Как я могу поднять одно и то же событие из разных классов?

2 ответа

Решение

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

public sealed class MyClass
{
    // this should be called from inside
    private void OnSomeEvent()
    {
        var handler = SomeEvent;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }

    // this should be called from outside
    public void RaiseSomeEvent()
    {
        OnSomeEvent(); 
    }

    public event EventHandler SomeEvent;

    // other code here...
}

Контроллер поля в SearchSource также имеет тип MasterViewController? Кажется, это другой тип.

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