MVP被动视图 - 在哪里连接视图的事件?

时间:2013-12-09 19:00:23

标签: c# mvp

我以前只是在我的视图上有一个ApplyPresenter()方法,但从技术上讲,如果视图知道演示者并在其上调用方法,那么这不是被动视图。

因此,我不是调用presenter.AButtonClicked(),而是可以从视图中公开一个事件,例如event EventHandler AButtonClicked,然后主持人会订阅。

但我在哪里订阅AButtonClicked?如果构造函数除了字段赋值之外不应该工作,我不能在构造函数中执行它。我可以在演示者身上使用Initialize()方法(或者称之为Setup()),但这不是代码味道吗?

我应该在构造函数中做一些额外的工作并在那里订阅视图的事件吗?

1 个答案:

答案 0 :(得分:0)

  

我应该在构造函数中做一些额外的工作并在那里订阅视图的事件吗?

你可以在构造函数中完成它 - 它是一个可以进行事件绑定的好地方。

您可以引入一个事件代理,比如IEventBroker,它可以让您的组件发布和订阅事件。

在演示者中:

public MyPresenter(
    IEventBroker eventBroker, ...)
{
   this.eventBroker = eventBroker;

   this.eventBroker.Subscribe("UpdateButtonClicked", this.WhenButtonClicked);
}

并且在视野中:

public MyView(
    IEventBroker eventBroker, ...)
{
   this.eventBroker = eventBroker;
}

private void someButton_Click(object sender, EventArgs e)
{
   this.eventBroker.Fire("UpdateButtonClicked", new EventArgs<Item>(lineID));
}

您可以说人们经常将被动视图定义为

  

查看不负责从模型中更新自身

其中没有说明有关控制器/演示者的视图知识。因此,您可以按原样保留ApplyPresenter()方法。