TextChanged事件 - 为什么这不会导致无限循环?

问题描述:

在试图做一些更复杂的事情时,我碰到了一个我不太明白的行为。TextChanged事件 - 为什么这不会导致无限循环?

假设下面的代码处理textChanged事件。

private void textChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox current = sender as TextBox; 
     current.Text = current.Text + "+"; 
    } 

现在,输入在文本框中的字符(比如A)将导致事件得到与最终文本绊倒两次(添加两个“+” S)显示的仅仅是一个+。

我的两个问题是,为什么事件只发生两次?为什么只有第一次穿过事件才能真正设置文本框的文本?

在此先感谢!

+2

为什么一个似乎没有多大意义的问题在4分钟内就有3个upvotes?我不明白.... – 2010-05-24 15:55:00

+0

...上涨到5票,然后回到3? hmmmmm ... – 2010-05-24 16:00:10

+1

事件TextBox.TextChanged在TextBox.Text发生更改时引发。但是,示例代码会在此通知期间更改文本,这会导致TextChanged的进一步升高,从而导致Text的新更改,这将会...... - >无限递归。
我不知道这个特殊情况是由TextBox类明确处理的 - 所描述的效果不会发生。相反,TextChanged只会被提升一次。我通过这个问题学到了一些东西,因此得到了提升。 – Matthias 2010-05-24 16:10:18

好 - 设置Text属性,当它被改变了/而它刚刚改变似乎是由文本框类明确被抓:

只需使用反射来看看里面TextBox.OnTextPropertyChanged(缩短):

TextBox box = (TextBox) d; 
if (!box._isInsideTextContentChange) 
{ 
    string newValue = (string) e.NewValue; 
    //... 
    box._isInsideTextContentChange = true; 
    try 
    { 
     using (box.TextSelectionInternal.DeclareChangeBlock()) 
     { 
      //... 
     } //Probably raises TextChanged here 
    } 
    finally 
    { 
     box._isInsideTextContentChange = false; 
    } 
    //... 
} 

领域_isInsideTextContentChange被设置为true 框TextChanged前事件得到[R aised。当再次更改文本属性时,TextChanged事件因此不会再次引发。

因此:特征;-)