使用WinForms的Humble View / MVP和UserControls的集合

时间:2012-01-31 17:49:51

标签: .net winforms mvp passive-view supervisingcontroller

我正在重构WinForms(.NET 4)应用程序,该应用程序使用TabControl来包含UserControl - UserControl在每个TabPage中实例化,最终结果是每个选项卡中的编辑器。它们正在编辑一组项目,这些项目最终会被整个表单输入到正在编辑的对象中。

作为示例类结构:

  • class School
    • string Name
    • string Address
    • Course的集合,每个都有几个适当的字段(DepartmentName等)。

(这实际上并不是与学校相关的应用程序,但这个比喻有效。)

从视觉上看,UserControls集合管理Course es,而父表单处理School信息。

现在,我有一个Form / School的演示者,以及UserControl / Course的演示者,每个人都有一个视图。然而,学校的主持人需要控制课程的一些信息。例如,为一个课程选择的选项限制其他课程中的选项。 School模型正在处理该计算,但它需要到达课程的演示者。

我在MVP讨论中找到这种关系的例子并没有太大的成功,这是我第一次采用MVP方法。处理这个有什么好办法吗?学校的主持人是否适合收集课程主持人的集合来代表该集?学校的观点是否应该收集课程观点的集合? (最终的UserControls必须以某种方式和某个地方附加到表单上,对吗?)

我的主要目标是(不出所料)提高可测试性和可维护性,到目前为止,主要来源是Michael Feathers的“The Humble Dialog Box”和Jeremy Miller的“Build You Own CAB”系列。

1 个答案:

答案 0 :(得分:3)

我如何处理类似的情况是父节目主持人应该知道儿童节目主持人(作为构造函数依赖关系)。

每个儿童主持人都有自己的观点,所以在父主持人中,我的逻辑就像是:

初​​始化()   - 初始化父   - 在每个子演示者上调用初始化(这是为了获取所有必要的数据,除了主要显示的数据。例如,如果您有发票演示者,如果您有客户组合框,则需要从某个地方获取客户集合,以便您可以更改此发票)   - 将子视图嵌入父视图(父视图通常是一个表单,其中子项是用户控件)

然后,通常在加载父级时,使用一些LoadXXX方法,我也加载子级。在您的示例中,它将类似于

schoolPresenter.LoadSchool(学校)

反过来会在所有演示者中加载数据,例如加载带有学校详细信息的父级控件,将课程集合传递给课程演示者等......

有人认为我觉得这样做很好,就是在每个演示者上都有一个Refresh()方法,它基本上知道如何根据当前状态加载自己。也许你不能在父节目主持人上有这样的方法,但简单的演示者工作得很好,所以这意味着在LoadSchool方法中你可以有类似的东西

coursesPresenter.Courses = school.Courses; coursesPresenter.Refresh();