澄清需要MVP模式中的演示者应该知道什么

时间:2013-03-23 22:12:43

标签: c# winforms mvp

我正在尝试将WindowsForm重构为MVP模式。该应用程序是一个磁贴编辑器。表单有一个自定义控件,我在其中显示tilemap(TileDisplay)。从文件加载地图后,我调用名为“AdjustHScrollBar”的方法将水平滚动条重新调整为tilemap-size。我不是100%肯定如何根据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种方法)。

2 个答案:

答案 0 :(得分:3)

Presenter图层的要点是能够在不知道视图细节的情况下与View图层进行通信,即与尺寸,颜色,视图类型有关的任何内容或任何其他财产。

通常presenter class会在其构造函数中使用view object。理想情况下,您将在视图上使用Adjust方法,并且演示者可以直接调用它,更理想的是,您可以通过接口而不是直接视图类来执行此操作。

在您的代码中,您正在访问所有视图的属性,然后尝试通过演示者操作它们,除非您对业务逻辑有某种依赖性,否则您不一定必须这样做。因此,您可以在View图层上执行整个操作,然后从Presenter图层调用它。

MVP涉及大量代码,这是您必须接受的权衡。

答案 1 :(得分: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
    }
}

Presenter知道何时以及如何获取数据,以及如何解释数据。您不应让演示者参与任何特定于视图的逻辑。