在Interfaces中引发事件

时间:2009-01-22 23:58:46

标签: c# events interface

我正在用MVP模式实现一个项目,我有一些像这样的接口:

public interface IWizardStep {
  event EventHandler NextStep;
}

public interface ISubmitable {
  event EventHandler Submit;
}

 public interface IStep : ISubmitable, IWizardStep {
  string SomeProperty { get; set; }
 }

我的演示者课程有这个:

public class StepPresenter {
  public IStep View { get; set; }

  public StepPresenter() {
    this.View.Submit += new EventHandler(StepSubmitted);
  }

  void StepSubmitted(object sender, EventArgs e){
    //do some processing

    //Now I want to raise the Next event
    //this.View.NextStep(sender, e) throws a compile error
  }

}

因此,当我尝试在View中引发NextStep事件时,我遇到编译错误。我很确定这是一个问题因为我没有为NextStep实现事件处理程序,但是这个演示者不会处理这个事件。

演示者将在窗体上的向导中实现为许多步骤(ASP.NET,但没有任何区别),向导将捕获NextStep事件并显示向导中的下一步。

那么如何才能在这样的界面上发生事件,或者这是不可能的呢?

2 个答案:

答案 0 :(得分:1)

这是因为NextStep是一个eventHandler。您不能调用必须引发的事件处理程序。我希望IStep有一个方法调用,比如MoveToStep(),具体实现会按预期引发事件,你可以订阅其他地方。

你对IWizardStep中的NextStep eventHandler的理由是什么?如果你正在使用它,那么在你的界面而不是事件中创建它。当IWizardStep有东西要传回(数据或其他)时,你的消费者类应该期望在需要“做”某事时调用一个方法并订阅一个事件

答案 1 :(得分:0)

@Ray Booysen:

是的,我在发布之后意识到我不应该尝试在界面上引发事件,但是我应该调用一个在View中引发事件的方法。所以我修改了我的接口和类:

public interface IWizardStep<TEventArgs> {
  event EventHandler<TEventArgs> NextStep;

  void RaiseNextStep<TSender>(TSender sender, TEventArgs e);
}

public class Step {
  void StepSubmitted(object sender, EventArgs e) {
    this.View.RaiseNextStep(sender, e);
  }
}

然后在View实现上我有:

public void RaiseNextStep<TSender>(TSender sender, EventArgs e) {
  if(this.NextStep != null) this.NextStep(sender, e);
}