我正在尝试将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种方法)。
答案 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知道何时以及如何获取数据,以及如何解释数据。您不应让演示者参与任何特定于视图的逻辑。