2

我正在重新设计一个 Winforms 应用程序,并希望为 UI使用Presentation Model 模式的变体。如果我做得正确,有人可以从以下解释中告诉我吗?


我决定按如下方式设置依赖项:

   Model <---- Presentation Model <---- View

那是:

  • 该模型除了自己之外什么都不知道。

  • 演示模型具有对模型的引用(反之亦然)。

  • 视图具有对表示模型的引用(反之亦然)。

我正在使用 Winforms 数据绑定来保持视图和表示模型同步。

现在这一切都像一个魅力,除了当我需要处理例如单击表单的“关闭”按钮时。由于表示模型没有对视图的引用,它不能订阅视图发布的任何事件。因此,我想出了以下拐杖:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

那是:

  • 用户单击“关闭”按钮。

  • 按钮的Click事件在视图中被捕获,它通过设置属性做出反应CloseRequested

  • 数据绑定将此值传输到表示模型中的相应属性。

  • 表示模型通过设置它的属性来响应这个变化IsClosed

  • 数据绑定将此值传输到视图的MustClose.

  • 视图通过关闭自身来响应这种变化。

演示模型与视图很好地分离,反之亦然,但是这只是处理单个按钮命令的大量工作。考虑到我决定的依赖关系图,有没有更简单的方法?

4

3 回答 3

2

我最近一直在将 Windows 窗体应用程序转换为 MVP 架构,看起来您已经以与我一直在做的类似方式设置依赖项。但是,我只是有一个IPresenter接口,它定义了允许视图传递用户请求的方法。由于视图已经依赖于演示者和对它的引用,因此直接在其上调用请求方法似乎是明智的。

所以在我的系统中,演示者监听来自模型的事件并触发它自己的演示事件以供任何感兴趣的视图监听。视图通过适当地更新自身来响应这些事件,并在发出用户请求时将它们转发给演示者。

于 2010-08-09T07:00:15.160 回答
1

这只是我的意见。

使用表示模型需要 100% UI 支持数据绑定。甚至 WPF 也不会将 CLOSE 操作设为可绑定。在 MessageBox Confirmation 等演示模型中,很多事情都不会顺利进行。即使它可以用 Presenter 接口进行抽象,但味道仍然不好,并且牺牲了简单性。

另一方面,表示模型的主要目的是测试视图逻辑。在某些情况下,如果您的“关闭操作”应该进行单元测试,因为在关闭之前有一些逻辑,那么您的代码是唯一的选择。但如果它只是一个简单的确认“你确定要退出”,那么你最好把它放在视图上,而不是在演示模型中,因为它不需要单元测试。

于 2010-08-10T06:45:54.847 回答
0

视图具有对表示模型的引用(反之亦然)。

AFAIK 演示文稿应该具有更准确地查看接口 IView 的参考,以便演示文稿不与具体视图耦合。然后在演示类中,您可以调用视图方法并通过 IView 订阅视图事件。

于 2010-08-09T07:52:08.383 回答