События TextChanged - Почему это не приводит к бесконечному циклу? - PullRequest
7 голосов
/ 24 мая 2010

Пытаясь сделать что-то более сложное, я столкнулся с поведением, которое я не совсем понимаю.

Предположим, что следующий код обрабатывает событие textChanged ниже.

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

Теперь, ввод символа в текстовом поле (скажем, A) приведет к тому, что событие будет отключено дважды (добавив два+ s) с отображаемым окончательным текстом просто A +.

У меня два вопроса: почему событие произошло дважды?И почему только первый проход через событие фактически устанавливает текст текстового поля?

Заранее спасибо!

1 Ответ

7 голосов
/ 24 мая 2010

Хорошо - установка свойства Text во время его изменения / пока он только что изменился, кажется, явно перехватывается классом TextBox :

Просто используйте Reflector, чтобы заглянуть внутрь 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 будет инициировано.При повторном изменении свойства Text событие TextChanged , таким образом, больше не вызывается.

Следовательно: Feature; -)

...