2010-05-24 23 views
7

Biraz daha karmaşık bir şey yapmaya çalışırken, tam olarak anlamadığım bir davranışla karşılaştım.TextChanged Events - Neden bu sonsuz bir döngü ile sonuçlanmaz?

MetinChanged olayını işlemek üzere aşağıdaki kodu varsayalım. Olay nihai metin üzerinde (s '+' iki ekleme) iki kez takıldı sadece A + olmak görüntülenen alma içinde

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

Şimdi, metin kutusuna bir karakter (diyelim ki, A) yazarak sonuçlanacaktır.

Benim iki sorumğum, neden olayın iki katı oldu? Ve neden sadece olay boyunca ilk koşmak aslında metin kutusunun metnini ayarlıyor?

Şimdiden teşekkürler!

+2

neden biraz mantıklı gibi görünen bir soru var 4 dakikadan kısa sürede 3 upvotes? Anlamadım .... –

+0

... 5 oya kadar çıktı ve sonra 3'e geri döndü? hmmmmm ... –

+1

TextBox.Text değiştiğinde TextBox.TextChanged olay ortaya çıkar. Bununla birlikte, örnek kod, bu bildirim sırasında metni değiştirir ve TextChanged'in daha fazla yükseltilmesiyle sonuçlanır. Bu da, yeni bir Metin değişikliği ile sonuçlanacak ... -> Sonsuz özyineleme.
Bu özel durumun TextBox sınıfı tarafından açıkça ele alındığını bilmiyordum - açıklanan etki oluşmayacak. Bunun yerine, TextChanged sadece bir kez yükseltilecektir. Bu sorudan bir şeyler öğrendim ve bu yüzden onu reddettim. – Matthias

cevap

7

Eh - bu sadece değişmiş olmasına karşın/değişti sınıf açıkça TextBox tarafından yakalanmış gibi görünüyor edilirken Metin özelliğini ayarlayarak:

Hemen içine bakıp Reflektör kullanmak TextBox.OnTextPropertyChanged () kısaltılmış:

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

TextChanged önce _isInsideTextContentChange true olarak ayarlanır alan olay r alır aised. Yeniden Metni özelliğini değiştirirken, TextChanged olayı yeniden yükseltilmez.

nedenle: Özellik ;-)