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