C# Windows窗体:孤岛加载与事件断开
在Windows窗体编程中,我有一个普遍的问题。在加载和填充页面时,在某些情况下,我不希望事件处理程序中的逻辑运行 事件处理代码主要用于响应用户交互,但在以编程方式操作控件时也会运行。在过去,我见过人们使用IsLoading布尔值来保护逻辑,而逻辑应该只在响应用户输入时发生。这让我觉得有点不雅观,而且开发者必须记住把它放在任何地方;当添加新功能时,这尤其是一个问题C# Windows窗体:孤岛加载与事件断开,c#,.net,user-interface,winforms,C#,.net,User Interface,Winforms,在Windows窗体编程中,我有一个普遍的问题。在加载和填充页面时,在某些情况下,我不希望事件处理程序中的逻辑运行 事件处理代码主要用于响应用户交互,但在以编程方式操作控件时也会运行。在过去,我见过人们使用IsLoading布尔值来保护逻辑,而逻辑应该只在响应用户输入时发生。这让我觉得有点不雅观,而且开发者必须记住把它放在任何地方;当添加新功能时,这尤其是一个问题 最近,我一直在编写方法,在加载表单时断开事件处理程序的连接,然后(在finally子句中)重新连接它们。这似乎好一点,但我想知道是否
最近,我一直在编写方法,在加载表单时断开事件处理程序的连接,然后(在finally子句中)重新连接它们。这似乎好一点,但我想知道是否有更优雅的方式。有人有其他方法来处理这种情况吗?解决这类问题最优雅的方法是使用模型视图演示者设计模式。在这里,背景代码不会直接修改控件的状态,而是修改模型,然后触发UI的更新。在WinForms的情况下,实现适当的MVP模式非常困难,但是您可以使用数据绑定将应用程序的状态与实际控件分开。正确实现绑定后,背景代码更新数据后,数据应自动显示在控件中。解决此类问题的最优雅方法是使用模型视图演示器设计模式。在这里,背景代码不会直接修改控件的状态,而是修改模型,然后触发UI的更新。在WinForms的情况下,实现适当的MVP模式非常困难,但是您可以使用数据绑定将应用程序的状态与实际控件分开。当您正确实现绑定时,在您的背景代码更新数据后,它应该自动显示在控件中。我认为这个问题是相关的,您会感兴趣:
我认为这个问题是相关的,你会感兴趣: 这里没有“正确”的答案,但我同意你的方法,并多次使用它。尽管无论小部件如何修改,我的事件都会被触发是件好事,但有时这正是我想要避免的。我经常在表单中编写DisableFooEventHandlers()/EnableFooEventHandlers()对方法。这让查看代码的人明白了我试图实现的目标。我尝试在匹配的方法/事件设置中使用这些设置,例如:
void BeginBulkProcessing()
{
DisbaleFooEventHandlers();
...
}
void OnBulkProcessingComplete()
{
...
EnableFooEventHandlers();
}
不是很吸引人,但它符合目的,而且很清楚这里发生了什么。我还没有找到更好的方法,因为最终,只有我(程序员)知道何时应该暂停处理,这很容易追踪。这里没有“正确”的答案,但我同意你的方法,并多次使用它。尽管无论小部件如何修改,我的事件都会被触发是件好事,但有时这正是我想要避免的。我经常在表单中编写DisableFooEventHandlers()/EnableFooEventHandlers()对方法。这让查看代码的人明白了我试图实现的目标。我尝试在匹配的方法/事件设置中使用这些设置,例如:
void BeginBulkProcessing()
{
DisbaleFooEventHandlers();
...
}
void OnBulkProcessingComplete()
{
...
EnableFooEventHandlers();
}
不是很吸引人,但它符合目的,而且很清楚这里发生了什么。我还没有找到更好的方法,因为最终,只有我(程序员)知道何时应该暂停处理,这很容易追踪。对-我知道怎么做,但问题是这是否是最好的模式。对-我知道怎么做,但问题是这是否是最好的模式。框架级数据绑定是否会避开已填充控件上的事件处理程序?例如_TextChanged事件?我们确实对这些表单使用MVC形式,但我的经验是,以任何方式填充控件都会触发事件处理程序。框架级别的数据绑定是否会避开已填充控件上的事件处理程序?例如_TextChanged事件?对于这些表单,我们确实使用了一种形式的MVC,但我的经验是,以任何方式填充控件都会触发事件处理程序。