我正在用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事件并显示向导中的下一步。
那么如何才能在这样的界面上发生事件,或者这是不可能的呢?
答案 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);
}