是什么阻止了互连Winforms控件之间的无限循环?

Dar*_*enW 5 c# events winforms

在表单上,​​我有两个控件,A和B.每个控件在其值发生变化时发送一个事件.Form通过将B设置为某个值来处理A的ValueChanged事件,并通过设置A的值来设置B的ValueChanged.

我是否需要做一些特殊的事情以防止无限循环,其中用户更改A,发送一个导致B更新的ValueChanged事件,现在将其发送给ValueChanged事件,导致A更新...

我知道一些GUI工具包,比如Qt,在基础设施中内置了逻辑,以防止这样的循环.(请参阅Qt4上Blanchette&Summerfield书籍第1章中的"输入您的年龄"示例.)一些较旧的工具包需要程序员定义和管理标志以检测递归.对于WinForms,我还没有在任何地方阅读确定的声明.

举一个具体的例子,假设A和B是NumericUpDown控件,以华氏度和摄氏度显示温度.当用户更改一个时,另一个更新以显示另一个系统中的相应温度.

Bis*_*its 1

在实现自定义控件时,我设法防止此问题的方法是仅在值实际发生更改时才引发事件,如下所示。

public string Text
{
    get { return _text; }
    set
    {
        if (_text != value)
        {
            _text = value;
            OnTextChanged();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可能会说,在触发事件之前不检查该值是否确实不同是糟糕的代码。

我不记得曾经遇到过 Windows 窗体控件的这些问题,因此我一直使用的控件必须正确执行此检查。