2

我正在尝试为 WINFORMS 实现 MVP 模式。它是一个简单的按钮和网格,单击按钮时,网格将加载,用户可以将值填充到网格中。

对于我的按钮单击事件,我有这样的事情:

_presenter.LoadGrid();

这是简单明了的。

我的问题是,关于网格...我计划触发一个行单击事件...用于启用/禁用网格的特定列/行等的后续输入字段。

我知道演示者不应该包含任何 GUI 元素,并且 View(form) 不应该真正包含逻辑?

因此,要触发 GridRowClick 事件,我需要根据业务规则 (Logic) 操作网格 (GUI)。我在让演示者处理该点击事件或表单的逻辑之间迷失了?

如果演示者要处理单击事件,那不包括 gui 组件吗?如果视图要处理点击事件,字段名等都是业务驱动的(逻辑),根据业务层返回的数据表动态绑定。

任何建议将不胜感激。

干杯

4

3 回答 3

1

MVP 有(至少)两种变体。

  • 被动视图模式
  • 监督控制器模式

顾名思义,被动视图将 UI 视为用户和应用程序之间或多或少的被动界面。它将尽可能多的可测试代码移至演示者,让视图仅处理最基本的 UI 更新。

监督控制器通过让视图处理数据同步来赋予视图更多的责任。这通常通过数据绑定来完成。

在任何一种情况下,事件处理都是通过委托给演示者方法来完成的:

EventHandler()
{
    presenter.HandleEvent();
}

如果处理事件需要对表单进行更改,则将需要更新的内容公开为属性:

public string PropertyThatNeedsToBeUpdated
{
    get
    {
        return Control.Property;
    }
    set
    {
        Control.Property = value;
    }
}

对于被动视图,网格是一个障碍。它们的复杂性使得捕获所有可能的事件变得很麻烦。使用监督控制器,网格更容易,因为您将数据同步留给数据绑定控件。

您必须判断哪个更适合您的情况。

于 2009-05-15T01:48:14.357 回答
0

关键是将所有业务逻辑放入可测试的演示者中。

视图应该调用演示者来执行业务逻辑,传递所需的信息(例如,与单击的行关联的数据)。

演示者然后执行业务逻辑并更新数据。

根据您需要进行的更改类型,这可能就是您需要做的所有事情,因为现有的数据绑定可能足以自动更新视图。如果这还不够,演示者可以对视图进行一次或多次调用(当然是通过其接口)以进行所需的更改。

正如您所说,您的目标应该是尽量减少视图中重要代码的数量,特别是视图中不应包含任何业务逻辑。

编辑:

关于 MVP 和其他演示模式的一些很好的一般信息:http ://martinfowler.com/eaaDev/uiArchs.html

于 2009-05-15T00:04:06.340 回答
0

您可能想查看来自 Polymorphic Podcast 的视频系列的第 4 部分。他使用监督控制器模式并展示了一种处理数据网格的技术。整个系列对我来说实际上是一个很好的介绍。

http://polymorphicpodcast.com/shows/mv-patterns/

于 2009-09-11T15:41:06.670 回答