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

Mel*_*eir 5 .net mvp passive-view supervisingcontroller winforms

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

作为示例类结构:

  • class School
    • string Name
    • string Address
    • Course,每个具有几个相应的字段(Department,Name等)

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

在视觉上,UserControls集管理Coursees,而父Form处理School信息.

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

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

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

Den*_*dic 3

我如何处理类似的情况是父演示者应该了解子演示者(即构造函数依赖项)。

每个子演示者都有自己的视图,因此在父演示者中我的逻辑如下:

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

然后在那之后,通常在加载父级时,使用一些 LoadXXX 方法,我也会加载子级。在你的例子中,它会是这样的

schoolPresenter.LoadSchool(学校)

这将依次加载所有演示者的数据,例如加载带有学校详细信息的家长控件,将课程集合传递给课程演示者等......

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

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