2013-12-09 58 views
0

我以前只是在我的視圖中只有一個ApplyPresenter()方法,但是從技術上講,如果視圖知道演示者並調用演示者的方法,那麼該方法不是被動視圖。MVP被動視圖 - 在哪裏連接視圖的事件?

因此,我不會打電話給presenter.AButtonClicked(),我可以從視圖中暴露一個事件,如演示者隨後訂閱的event EventHandler AButtonClicked。我在哪裏訂閱AButtonClicked?如果構造函數除了字段賦值之外不應該做任何工作,我不能在構造函數中完成。我可以在我的演示者上使用Initialize()方法(或稱爲Setup()),但這不會是代碼味道嗎?

我應該在構造函數中做一些額外的工作並訂閱視圖的事件嗎?

+0

我不明白;爲什麼不再在'演示者的構造函數'中? –

+0

我的確有點像這樣實現。我將視圖實際上注入到了演示者中,並在構造函數中訂閱了所有視圖的事件。 –

+0

使用演示者的「開始」和「停止」方法告訴它何時訂閱/取消訂閱視圖上的事件。讓更高級別的組件負責告訴主持人何時開始和停止。 – prprcupofcoffee

回答

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()方法。