2013-06-26 266 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线程)。