TextChanged事件 - 为什么这不会导致无限循环?
问题描述:
在试图做一些更复杂的事情时,我碰到了一个我不太明白的行为。TextChanged事件 - 为什么这不会导致无限循环?
假设下面的代码处理textChanged事件。
private void textChanged(object sender, TextChangedEventArgs e)
{
TextBox current = sender as TextBox;
current.Text = current.Text + "+";
}
现在,输入在文本框中的字符(比如A)将导致事件得到与最终文本绊倒两次(添加两个“+” S)显示的仅仅是一个+。
我的两个问题是,为什么事件只发生两次?为什么只有第一次穿过事件才能真正设置文本框的文本?
在此先感谢!
答
好 - 设置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事件因此不会再次引发。
因此:特征;-)
为什么一个似乎没有多大意义的问题在4分钟内就有3个upvotes?我不明白.... – 2010-05-24 15:55:00
...上涨到5票,然后回到3? hmmmmm ... – 2010-05-24 16:00:10
事件TextBox.TextChanged在TextBox.Text发生更改时引发。但是,示例代码会在此通知期间更改文本,这会导致TextChanged的进一步升高,从而导致Text的新更改,这将会...... - >无限递归。
我不知道这个特殊情况是由TextBox类明确处理的 - 所描述的效果不会发生。相反,TextChanged只会被提升一次。我通过这个问题学到了一些东西,因此得到了提升。 – Matthias 2010-05-24 16:10:18