2010-04-06 220 views
3

是否有可能知道任何文本框值是否在應用程序中發生了更改。 我有大約30個文本框,我只想運行一部分代碼,如果任何一個文本框的值已經改爲30以外。有沒有辦法我可以知道。文本框值已更改

回答

7

當內容發生變化時,每個文本框將引發事件TextChanged。但是,這要求您訂閱每個事件。

好消息是,您可以多次使用相同的方法訂閱活動。處理程序有一個參數sender,您可以使用該參數來確定您的30個文本框中的哪一個實際上引發了該事件。

您還可以使用GotFocusLostFocus事件來跟蹤實際更改。您需要將原始值存儲在GotFocus上,然後與LostFocus上的當前值進行比較。這解決了兩個TextChanged事件相互抵消的問題。

+0

的問題是 「有值改爲」 不「有TextChanged事件觸發「。如果用戶將文本「香蕉」編輯爲「bananaX」,然後按退格,他又回到「香蕉」......並且沒有任何變化。骯髒的檢測從WPF控件丟失... – Jack 2013-02-21 18:56:15

+0

@傑克 - 增加了一個可能的解決方案。 – ChrisF 2013-02-21 22:37:58

+0

如果使用MVVM + Binding,那麼在WPF中沒有簡單的方法來做到這一點,因爲Binding類(它完全可以檢測正在編輯的)不會... – Jack 2013-02-23 08:04:52

2

您可以爲每個TextBox的TextChanged事件分配一個事件處理程序。所有這些都可以在代碼中分配給相同的事件處理程序。然後你會知道文本何時改變。您可以在課程中設置一個布爾標誌字段來記錄發生了變化。

1

試試這個。將此代碼添加到加載/構造函數。不需要在XAML中明確指定事件

this.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(TextChanged)); 
private void TextChanged(object Sender, TextChangedEventArgs e) 
{ 
    //ToDO (use sender to identify the actuale text from where it fired } 
} 
1

這可能是粗糙和準備好的一面,但我是這樣做的。

在構造中,我創建

布爾bChanged = FALSE;

在每個控制(實際上相同的每個)的TextChanged事件處理程序中,我把

bChanged = TRUE;

適當時,我可以做一些處理,並將bChanged設置爲false。

1

你也可以這樣做:

在構造函數:

MyTextBox.TextChanged += new TextChangedEventHandler(TextChanged); 

然後將此方法:

private void TextChanged(object Sender, TextChangedEventArgs e){ 
      //Do something 
     }