2010-05-24 8 views
7

Al tratar de hacer algo un poco más complicado, encontré un comportamiento que no entiendo del todo.Eventos TextChanged - ¿Por qué esto no da como resultado un ciclo infinito?

Supongamos el siguiente código a continuación sobre el manejo del evento textChanged.

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

Ahora, al escribir un carácter en el cuadro de texto (por ejemplo, A) resultará en el caso de conseguir tropezó dos veces (la adición de dos '+' s) con el texto final aparece ser sólo un +.

Mis dos preguntas son, ¿por qué se golpea el evento solo dos veces? ¿Y por qué solo la primera vez que se ejecuta el evento establece el texto del cuadro de texto?

¡Gracias de antemano!

+2

¿por qué una pregunta que parece tener poco sentido tiene 3 upvotes en menos de 4 minutos? No lo entiendo ... –

+0

... subí a 5 votos y luego volví a 3? hmmmmm ... –

+1

El evento TextBox.TextChanged se inicia cuando TextBox.Text ha cambiado. El código de ejemplo, sin embargo, cambia el texto durante esta notificación, lo que debería provocar un aumento de TextChanged que dará como resultado un nuevo cambio de texto que ... -> recursividad sin fin.
No sabía que este caso especial es manejado explícitamente por la clase TextBox, el efecto descrito NO ocurrirá. En cambio, TextChanged solo se levantará una vez. Aprendí algo a través de esta pregunta y, por lo tanto, la voté al alza. – Matthias

Respuesta

7

Bueno - establecer la propiedad de texto mientras está siendo cambiado/mientras se acaba de cambiar parece estar atrapado por el cuadro de texto clase de forma explícita:

sólo tiene que utilizar el reflector para mirar dentro TextBox.OnTextPropertyChanged (abreviada):

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; 
    } 
    //... 
} 

el campo _isInsideTextContentChange se establece en true antes de la TextChanged evento se r aised. Cuando se cambia la propiedad Text de nuevo, el evento TextChanged no vuelve a aparecer.

Por lo tanto: Característica ;-)

Cuestiones relacionadas