WinForms和一组UserControls的Humble View/MVP

5

我正在重构一个使用TabControl包含UserControl的WinForms(.NET 4)应用程序——每个TabPage中都使用UserControl实例,最终结果是在每个选项卡中编辑器。这些编辑器用于编辑一组项目,最终将这些项目提供给整个表单所编辑的对象。

例如类结构如下:

  • class School
    • string Name
    • string Address
    • 一组Course,每个具有几个适当的字段(DepartmentName等)

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

从视觉上看,一组UserControl管理Course,而父表单处理School信息。

目前,我为Form/School和UserControl/Course分别拥有一个Presenter,每个都有相应的视图。然而,School的Presenter需要控制Course的一些信息。例如,为一个Course选择的选项会限制其他Course的选项。 School模型正在处理计算,但它需要传递到Course的Presenter。

我并没有找到很多MVP讨论中这种关系的示例,而这是我第一次采用MVP方法。处理这种情况的好选择是什么?是否适合让School的Presenter拥有一组Course的Presenter表示该组?应该让School的View持有一组Courses的View吗?(最终UserControl必须以某种方式和某个地方连接到表单上,对吧?)

我的主要目标是(不足为奇地)增加可测试性和可维护性,到目前为止,在这个过程中的主要参考资料是Michael Feathers的"The Humble Dialog Box" 和Jeremy Miller的"Build You Own CAB"系列。

1个回答

3
我处理类似情况的方法是,父级Presenter应该了解子Presenter(作为构造函数依赖项)。
每个子Presenter都有自己的视图,因此在父Presenter中,我的逻辑如下:
Initialize() - 初始化父级 - 调用每个子Presenter的initialize(这是为了获取除主要显示的数据之外的所有必要数据。例如,如果您有一个发票Presenter,您需要从某个地方获取客户集合,如果您将拥有客户组合框,则可以更改这个组合框以用于发票) - 将子视图嵌入父视图(父视图通常是一个窗体,其中子控件是用户控件)
然后,在加载父级时,通常使用一些LoadXXX方法,我也会加载子级。在您的示例中,它可能类似于
schoolPresenter.LoadSchool(school)
这将反过来加载所有Presenter的数据,例如使用学校详细信息加载父控件,将课程集合传递给课程Presenter等...
我注意到的一个好习惯是在每个Presenter上都有一个Refresh()方法,它基本上知道如何根据当前状态加载自身。也许您不能在父Presenter上有这样的方法,但对于简单的Presenter,这种方法很好用,这意味着在LoadSchool方法中,您可以这样做:
coursesPresenter.Courses = school.Courses; coursesPresenter.Refresh();

1
非常抱歉回复如此缓慢。这种方法非常有效,并且易于测试。谢谢! - Melissa Avery-Weir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接