2013-06-26 316 views
4

最初,這個問題把我帶到這裏: Disable firing TextChanged event取消訂閱/訂閱活動危險?

我想知道,如果jtmach的回答是‘乾淨’:

private void mytextbox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     this.mytextbox.TextChanged -= this.myTextBox_TextChanged; 

     if(textbox.Text.ToString().Contains('.')) 
     { 
      textbox.Foreground = new SolidColorBrush(Colors.Gray); 
      textbox.Background = new SolidColorBrush(Colors.White); 
     } 

     this.mytextbox.TextChanged += this.myTextBox_TextChanged;  
    } 

是否確定取消TextChanged -events在這樣的另一個事件?因爲引發LostFocus期間

或者是容易出錯的TextChanged事件可以被稱爲(由用戶或程序)?

+3

這只是我,但我會用一個標誌(即:'如果(IsProcessing)回報;'),鎖或某種某種(類似於一個反應式庫中)的節流的。 –

+0

我個人會使用類似於該問題的接受答案。當我處理分配給處理程序的動態控件時,我只刪除處理程序。 –

+0

這沒關係。並且沒有框TextChanged無法從失去重心被稱作......至少我看不出 –

回答

2

如果這是在一個多線程的上下文那麼這將是一個問題。當您取消訂閱時,TextChanged事件當前可能會運行,從而阻止您在此代碼也在運行時假設它正在運行。

這就是說,在這種情況下,這兩種方法將總是在UI線程中運行,因此這個代碼將不會真的是「破」(你無法同時運行的文本改變事件,因爲在UI線程可以無論如何,只能同時運行兩個事件中的一個),但它也不能達到目的,只能被刪除(因爲在此事件處理程序正在運行時無法觸發事件,因爲它阻止了UI線程)。