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



我过去只在视图中有一个ApplyPresenter()方法,但从技术上讲,如果视图知道演示者并调用它上的方法,那就不是被动视图。

因此,我可以从视图中公开一个事件,而不是调用presenter.AButtonClicked(),比如event EventHandler AButtonClicked,然后演示者订阅它

但是我在哪里订阅AButtonClicked?如果构造函数除了字段赋值之外不应该做任何工作,那么我就不能在构造函数中做。我可以在我的演示者上有一个Initialize()方法(或者可能称之为Setup()),但这不是一种代码气味吗?

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

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

您可以在构造函数中执行此操作——这是执行事件绑定的好地方。

或者您可以引入一个事件代理,比如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()方法不变。

最新更新