【问题标题】:What design pattern do I use to synchronize changes in the object model state to the GUI's state?我使用什么设计模式将对象模型状态的更改同步到 GUI 的状态?
【发布时间】:2011-01-16 00:04:16
【问题描述】:
我通常在 GUI 上工作,我希望通过禁用表单上的控件来直接阻止用户做他们不应该做的事情。例如,除非用户当前在应用程序中打开了“Widget Project”,否则我可能不希望启用“Process Widgets”按钮?或者“取消处理”按钮仅在小部件处理运行时启用。
是否有一种常用的设计模式可以将对象模型中的状态更改与 GUI 的状态同步?
【问题讨论】:
标签:
winforms
user-interface
design-patterns
【解决方案1】:
听起来您正在寻找订阅某些事件的能力。我会说使用观察者模式。在这种情况下,状态模式有点过头了[如果它大于二进制条件,那么你可以让状态模式适应它]
【解决方案2】:
MVC 和命令模式应该在这里工作。基本思想是您需要向 GUI 发送“消息”(可能是对象或字符串或任何东西)以通知它更改其状态和方式。您只需要小心考虑 GUI 接收和处理消息时可能发生的任何延迟。
您可以创建一个事件队列(与命令相关联)并确保第一个进入是第一个退出(因此是队列)。然后让 GUI 处理队列中的下一个事件,这将确保在您触发另一个事件以执行您刚刚尝试禁用的操作之前更新 GUI。然后你可以报告错误或忽略它或其他什么。无论哪种方式,一旦收到禁用该功能的命令,用户将无法执行任何操作。禁用 GUI 按钮只是一种视觉效果,应该有后台命令的预防代码真正为您工作。
【解决方案3】:
我不是专家,但最近我一直在阅读有关 WPF 的 Model-View-ViewModel 模式,它基本上是一种利用 WPF 功能的 MVC 模式。由于您使用的是 winforms,因此您可以尝试 Model-View-Presenter 模式。 There's an article here about it.
如果你可以切换到 WPF(虽然我感觉 winforms 有类似的东西),听起来你肯定想使用命令功能。它具有您想要内置的一些功能。基本上任何按钮或任何订阅命令的东西,并且有一个逻辑部分确定命令是启用还是禁用。您只需要检查模型的状态即可。
【解决方案4】:
这不适用于 winforms,但 Qt 最近引入了一个状态机框架,以便根据应用程序的内部状态轻松更改 UI 元素的状态。请参阅Qt documentation 了解更多信息。
这个想法可能也可以应用于基于 winforms 的应用程序。不过,这可能会花费相当大的初始努力。我不知道任何现有的实现。