0

我正在尝试将 WindowsForm 重构为 MVP 模式。该应用程序是一个磁贴编辑器。表单有一个自定义控件,我在其中显示 tilemap (TileDisplay)。从文件加载地图后,我调用名为“AdjustHScrollBar”的方法将水平滚动条重新调整为 tilemap 大小。我不是 100% 确定如何根据 MVP 拆分方法。首先是原始的none MVP方法:

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

这是在presenter中使用MVP后的方法:

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

视图不知道演示者。我的问题是演示者是否应该知道视图的控件。在我的实现中它没有——这就是 GetTileDisplayWidth、EnableHScrollBar 和 DisableHScrollBar 方法的原因。Afaik 这是正确的方法,但是如果我必须从视图中为我需要的每个属性创建一个方法,这似乎变成了很多工作。例如,对于垂直滚动条,我基本上有“相同”的代码(所以这是重新调整滚动条的 6 种方法)。

4

2 回答 2

3

层的重点Presenter是能够在View不知道视图细节的情况下与层通信,即与大小、颜色、视图类型或任何其他属性有关的任何事情。

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

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

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

于 2013-03-23T22:18:47.490 回答
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 参与任何特定于视图的逻辑。

于 2013-03-23T22:50:30.520 回答