2013-03-23 44 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 
    } 
} 

演示者知道什么时候以及如何获得数据,以及如何解释数据。您不应该让演示者参与任何视图的特定逻辑。