2011-11-02 88 views
2

我遇到了textbox.textchanged事件的問題。我的文本框是數據綁定的,當頁面加載時,textchanged事件觸發器。我如何防止它發生,只有當用戶做出任何改變時纔會觸發它?加載頁面時觸發Textbox.TextChanged。我如何防止它?

+0

請問爲什麼這個初始事件調用是一個開始的問題?也許我們可以解決問題背後的問題 – Amenti

+0

嗨Amenti。我有一個帶有保存和取消按鈕的導航頁面。帶有一堆文本框的頁面最初用一些默認值填充。我需要限制用戶在按下保存和取消按鈕之前導航出該頁面的能力。 – will0809

+0

我可以模擬取消按鈕按這樣的事情: 'someButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));' 但它沒有奏效。我把它放在InitializeComponent()之後。我做錯了嗎? – will0809

回答

8

內TextChanged事件處理程序,如果窗口(或用戶控件,或其他)被加載,你可以驗證:

if (this.IsLoaded) 
{ 
    //your logic here 
} 

這樣,您就可以跳過框TextChanged事件的第一次點火,當沒有加載窗口。

+0

嗨icebat。我試過這個,但是它在初始化和加載完成後碰到的第一件事是textchanged事件。所以它無論如何都開了火。 – will0809

+0

你不能有一個默認值,你可以檢查只是第一次,然後改變它? – MaRuf

+0

@ will0809,那很奇怪。你如何設置默認值?數據綁定或在代碼中設置? – icebat

1

那麼,從您的評論我收集到,你希望用戶進行更改,只有當他顯式保存或關閉表單時才傳播到基礎數據。

您可以在這裏使用UpdateSourceTrigger「顯式」。

<TextBox Text={Binding MyData, UpdateSourceTrigger=Explicit}/> 

所以更改只能通過當你的用戶點擊保存按鈕,您的綁定顯式調用UpdateSource傳播。

如果您使用MVVM,還可以在ViewModels中以代碼方式實現相同的邏輯。

2

問題是,無論何時設置文本,TextChanged都會觸發。這正是WPF的工作方式。通過訂閱Window/Usercontrol的Loaded事件,您可以通過在代碼隱藏中設置事件來「解決」此問題。 Loaded事件在每個孩子和他們的孩子完成加載之後觸發,並準備好顯示。

<UserControl ---- Loaded="UserControl_Loaded">  
- 
public void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    _txtBox.TextChanged += txt_changed; 
} 

public void txt_changed(object sender, RoutedEventArgs e) 
{ 
    (...) 
} 
+0

我認爲這不起作用的原因是我的文本框是數據綁定的,我的默認值在加載完成後加載到文本框中,導致textchanged事件觸發。 – will0809

0

我有同樣的問題,並最終解決。

在窗口上,我添加了一個窗口加載的變量,並將Window_Loaded事件結束時設置爲true。

在TextChanged事件上檢查您的變量是否爲true。