gpt4 book ai didi

.net - 带有 WinForms 和 UserControls 集合的 Humble View/MVP

转载 作者:行者123 更新时间:2023-12-04 20:52:21 24 4
gpt4 key购买 nike

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

作为示例类结构:

  • class School
  • string Name
  • string Address
  • 收藏 Course s,每个都有几个合适的字段( DepartmentName 等)

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

    从视觉上看,一组 UserControls 管理着 Course es,而父 Form 处理 School信息。

    现在,我有一个 Form/School 的演示者和一个 UserControl/Course 的演示者,每个都有一个 View 。然而,学校的演示者需要控制类(class)的一些信息。例如,为一门类(class)选择的选项会限制其他类(class)的选项。 School模型正在处理它的计算,但它需要到达类(class)的演示者。

    我在 MVP 讨论中找到这种关系的例子并没有取得多大成功,这是我第一次采用 MVP 方法。处理这个问题有什么好的选择?学校的演讲者收集类(class)演讲者的集合来代表集合是否合适?学校的观点是否应该包含类(class)观点的集合? (最终的 UserControls 最终必须以某种方式和某处附加到表单上,对吗?)

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

    最佳答案

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

    每个子演示者都有自己的观点,所以在父演示者中,我的逻辑类似于:

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

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

    schoolPresenter.LoadSchool(学校)

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

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

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

    关于.net - 带有 WinForms 和 UserControls 集合的 Humble View/MVP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084406/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com