2013-03-23 90 views
0

我試圖將WindowsForm重構爲MVP模式。該應用程序是一個瓷磚編輯器。窗體有一個自定義控件,我在其中顯示地圖(TileDisplay)。從文件加載映射後,我調用一個名爲「AdjustHScrollBar」的方法來重新調整水平滾動條到tilemap大小。我不是100%確定如何根據MVP分割方法。 首先原來沒有MVP方法:澄清需要MVP模式中的演示者應該知道的內容

private void AdjustHScrollBar() 
{ 
    if (tileMap.GetWidthInPixels() > tileDisplay.Width) 
    { 
     hTileScrollBar.Visible = true; 
     hTileScrollBar.Minimum = 0; 
     hTileScrollBar.Maximum = tileMap.GetWidth(); 
    } 
    else 
    { 
     hTileScrollBar.Visible = false; 
    } 
} 

這是演示使用MVP後的方法:

private void AdjustHScrollBar() 
{ 
    if (mainFormModel.TileMap.GetWidthInPixels() > mainFormView.GetTileDisplayWidth()) 
    { 
     mainFormView.EnableHScrollBar(mainFormModel.TileMap.GetWidth()); 
    } 
    else 
    { 
     mainFormView.DisableHScrollBar(); 
    } 
} 

視圖不知道主持人。我的問題是主持人是否應該知道視圖的控制。在我的實現中,它不會 - 這就是GetTileDisplayWidth,EnableHScrollBar和DisableHScrollBar方法的原因。 Afaik這是正確的方式,但是如果我必須從視圖中爲我需要的每一個屬性製作一個方法,這似乎變成了很多工作。基本上,垂直滾動條的「相同」代碼用於例如(所以這6種方法可以重新調整滾動條)。

回答

3

Presenter圖層的要點是要能夠在不知道視圖細節的情況下與圖層進行通信,即與大小,顏色,視圖類型或任何其他屬性有關的任何內容。

通常presenter class將在其構造函數中使用view object。理想情況下,您可以在視圖上使用Adjust方法,並且演示者可以直接調用它,更理想的情況是您可以通過界面而不是直接查看類來完成此操作。

在您的代碼中,您正在訪問所有視圖的屬性,然後試圖通過演示者操縱它們,除非您對業務邏輯有某種依賴性,否則不一定必須這樣做。因此,您可以在View圖層上執行整個操作,然後從Presenter圖層調用它。

MVP涉及很多代碼,這是您必須接受的權衡。

+0

感謝您的回答。 – 2013-03-23 22:35:34

+0

我在演示者中這樣做的原因是它取決於模型(地圖大小)。 – 2013-03-23 22:44:14

1

我會做的演講是這樣的:

public interface ITileMapView 
{ 
    event EventHandler<string> TileMapFileLoaded; 
    void OnTileMapLoaded(TileMapModel model); 
} 

public class TileMapPresenter 
{ 
    private readonly ITileMapView view; 

    public TileMapPresenter(ITileMapView view) 
    { 
     this.view = view; 
     view.TileMapFileLoaded += OnTileMapFileLoaded; 
    } 

    private void OnTileMapFileLoaded(object sender, string filename) 
    { 
     // Parse data from file 
     // Populate model 

     // Tell view 
     view.OnTileMapLoaded(model); //Implement the 'AdjustHScrollBar' logic in the view 
    } 
} 

演示者知道什麼時候以及如何獲得數據,以及如何解釋數據。您不應該讓演示者參與任何視圖的特定邏輯。