使用EventArgs和Event定义Eventhandler以在多个类中工作

时间:2014-09-11 11:27:44

标签: c# events event-handling eventargs

我将自定义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;

MasterViewController 中的 DataSource 中,我可以举起活动:

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

正如您所看到的,我在 DataSource 中有一个字段( controller ),我用它来引用该事件。现在我有一个具有相同概念的 SearchSource (也称为 controller 字段)。现在在 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 个答案:

答案 0 :(得分:3)

您无法直接在该类型之外引发事件,该事件定义此事件。 您所能做的就是一种方法,它将从外部引发事件:

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...
}

答案 1 :(得分:0)

搜索源中的字段控制器是否也适用于MasterViewController类型? 它似乎是一种不同的类型。