c# - C# Windows 窗体的设计模式

标签 c# windows forms

我正在编写一个抽认卡程序,但遇到了一个我在编写此类表单程序时似乎总是遇到的问题。

我会先描述程序,然后再描述问题。

在这个程序中,一个主窗体控制了几乎所有的 Action 。根据用户的输入和表单事件,可能会启用或禁用不同的按钮/控件,可能会填充各种框中的文本等。

例如:

  • 有些问题可能是选择题,有些则需要打字输入。
  • 用户输入他们的答案并点击一个按钮——如果他们做错了什么,他们可以选择覆盖“错误答案”的判断,并说这确实是一个不同的、正确的变体。
  • 关于哪些问题被正确回答的统计数据会被保存下来,并用于决定接下来要显示哪些抽认卡。

现在是问题。

我如何最好地在“表单”代码(例如,处理 OK 按钮的 onclick 命令,以及启用或禁用各种控件)和“逻辑”代码(底层数据存储、程序逻辑)之间创建一个干净的交互对显示没有直接影响)?如果它在表单对象代码中全部混合在一起,它似乎不正确。

任何人都可以建议一种设计模式(尤其是广泛使用的模式)来干净地管理它吗?

如果它是相关的,我正在考虑这样的事情:

  • 对象模型:
    • MyForm 类:表单本身。
    • 类 FormController:
      • MyForm 的子类。
      • 实例化需要一个 MyForm 类型的对象。
      • FormController 的工作是通过启用/禁用控件、显示各种文本等将其 MyForm 对象置于特定“状态”。
      • FormController 公开了一小组公共(public)函数,用于处理对表单状态的语义高级请求(例如“DisplayNewQuestion(QuestionData d)”)
    • 类(class) session :包含涉及此 session 的所有底层持久数据或对象,包括可能问题的列表、从列表中选择下一个问题的对象等。
    • 驱动类:驱动 Session 和 FormController 对象。例如,它会向 Session 对象询问一个新问题,并将其传递给 FormController 对象以更新表单。

这样做的好处是,恶心的表单代码和漂亮的逻辑代码现在可以完全分离了。但值得吗?是否有更好或更常见的设计模式?

非常感谢!

最佳答案

在这种情况下,我总是最喜欢使用 Model View Controller。 Shade Tree Developer 写了我读过的关于这个主题的最有见识的系列文章,see here

MVC的要义是

模型包含要显示的数据

View 是您的表单,仅具有显示和通知用户交互的逻辑

Controller 包含使这一切发生的胶水,包括业务逻辑。

依赖应该是

模型不知道 View 或 Controller

View 了解模型并知道如何从中提取数据进行显示

Controller 了解模型和 View ,实例化它们并将它们连接在一起。

模型在发生变化时引发事件, View 捕获此事件并相应地刷新其显示。

当用户交互发生时, View 会引发一个事件, Controller 会捕获此事件并为交互执行正确的操作,无论是更新模型还是保存或清除等等。

View 不应写入模型本身

您会看到很多代码在表单创建 Controller 的地方,但我认为这是错误的。它的出现是因为人们试图在您无法控制生命周期的 asp.net webforms 中应用这种模式,总是首先创建的是一个 View ,所以您别无选择,只能创建您的 Controller ,但是在winforms 你在控制中,所以让它干净,让 Controller 创建 View 。

关于c# - C# Windows 窗体的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9196460/

相关文章:

c# - 如何在已有多个表的现有数据库中对单个表使用 Code First 方法

c# - 如何安全地混契约(Contract)步和异步代码?

windows - 混合 Windows 和 *nix 环境 - 'local' 后缀问题

java - 为什么我的 jarsigner 不起作用?

python - 用 Python 处理 HTML 表单数据?

仅当下一个输入大于 1 时,Jquery 才乘以值

c# - 如何将所有资源包含到一个 html 文件中?

c# - 我如何有条件地启用或禁用 [​​RequireHttps]

windows - 在 Anaconda Powershell 中只获取 IP 地址

php - AJAX 表单提交并上传文件