Определите 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? Кажется, это другой тип.