2009-11-19 56 views
1

在Windows窗体编程中,我有这个一般问题。当页面加载和填充时,在某些情况下,我不希望事件处理程序中的逻辑运行。Windows窗体:isLoading vs事件断开

事件处理代码主要是为了响应用户交互,但它也在编程操作控件时运行。在过去,我已经看到人们使用IsLoading布尔值来保护逻辑,这些逻辑只会响应用户输入而发生。这让我觉得有点不雅,而且开发人员必须记得把它放在任何地方;当添加新功能时,这是一个特别的问题。

最近,我一直在写方法来加载表单时断开事件处理程序,然后重新连接它们(在finally子句中)。这看起来好一点,但我想知道是否有更优雅的方式。任何人都有另一种方式来处理这种情况?

回答

1

有没有“正确”的答案在这里,但我同意你的方法,并已经使用了无数次。无论widget如何被修改,我的事件被触发是很好的,有时这正是我想要避免的。我经常在我的表单中写入DisableFooEventHandlers()/ EnableFooEventHandlers()对方法。这让查看代码的人清楚我想要完成什么。我尝试匹配的方法/事件设置使用这些,例如:

void BeginBulkProcessing() 
{ 
    DisbaleFooEventHandlers(); 
    ... 
} 

void OnBulkProcessingComplete() 
{ 
    ... 
    EnableFooEventHandlers(); 
} 

不讨人喜欢,但它服务的宗旨,很明显这是怎么回事。我还没有找到更好的,因为最后,只有我(程序员)知道什么时候应该暂停处理,并且这很容易追踪。

0

解决此类问题最优雅的方法是使用模型视图展示器设计模式。在这里,后台代码并不直接摆脱控件的状态,而是改变模型,然后触发UI的更新。我以WinForms为例,它很难实现适当的MVP模式,但是你可以使用数据绑定来将应用程序的状态与实际的控件分开。当您正确实现绑定时,在您的后台代码更新数据后,它应自动显示在控件中。

+0

框架级别的数据绑定是否会在已填充的控件上闪避事件处理程序?例如_TextChanged事件?我们确实为这些表单使用了MVC的形式,但是我的经验是以任何方式填充控件的行为通常会触发事件处理程序。 – Jason 2009-11-19 16:53:02