在Windows窗体编程中,我遇到了这个一般性问题。当页面加载和填充时,在某些情况下我不希望事件处理程序中的逻辑运行。
事件处理代码主要用于响应用户交互,但它也在以编程方式操作控件时运行。在过去,我看到人们使用IsLoading布尔来保护逻辑,这些逻辑只应该响应用户输入而发生。这让我觉得有点不优雅,开发人员也必须记住把它放在任何地方;添加新功能时尤其如此。
最近我一直在编写方法来在加载表单时断开事件处理程序,然后重新连接它们(在finally子句中)。这似乎好一点,但我想知道是否有更优雅的方式。任何人都有另一种处理这种情况的方法吗?
答案 0 :(得分:1)
这里没有“正确”的答案,但我同意你的方法并且多次使用它。虽然无论窗口小部件如何被修改,我的事件都会被触发,这很好,但有时这正是我想要避免的。我经常在表单中编写DisableFooEventHandlers()/ EnableFooEventHandlers()方法对。这使得查看代码的人明白我想要完成的任务。我尝试在匹配的方法/事件设置中使用它们,例如:
void BeginBulkProcessing()
{
DisbaleFooEventHandlers();
...
}
void OnBulkProcessingComplete()
{
...
EnableFooEventHandlers();
}
不是很迷人,但它有助于达到目的,而且很清楚这里发生了什么。我还没有找到更好的东西,因为最后,只有我(程序员)知道何时应该暂停处理,这很容易追溯。
答案 1 :(得分:0)
解决此类问题的最佳方法是使用Model View Presenter设计模式。这里背景代码不会直接控制控件的状态,而是改变模型,然后触发UI的更新。我在WinForms的情况下很难实现正确的MVP模式,但您可以使用数据绑定将应用程序的状态与实际控件分开。正确实现绑定后,在后台代码更新数据后,它应自动显示在控件中。
答案 2 :(得分:0)
我认为这个问题是相关的,您会对此感兴趣: