2014-09-27 77 views
1

我有一個Textbox,它有一個KeyDown事件。該事件與ViewModel中的事件處理程序綁定。下面是示例代碼:KeyDown事件的延遲計時器

<TextBox x:Name="textBox" Text="{Binding TextBoxText, UpdateSourceTrigger=PropertyChanged}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <cmd:EventToCommand Command="{Binding Path=TextBoxKeyDownEvent}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
<TextBox.InputBindings> 

這是事實,一旦用戶開始在texbox寫作,在視圖模型後端調用事件處理程序。但我不想爲每個KeyDown操作調用事件處理程序。我想在用戶開始在文本框中輸入並停止至少N毫秒時調用事件處理函數。這意味着我需要爲事件設置一個延遲計時器。任何人都可以請指導我如何在MVVM中實現這一點?

回答

4

您可以使用BindingBase.Delay屬性:

<TextBox x:Name="textBox" Text="{Binding TextBoxText, Delay=500, UpdateSourceTrigger=PropertyChanged}" /> 

這將修改TextBoxText財產在你的視圖模型已經被用戶更改只有500毫秒後。然後,在你的setter中,你可以調用你想要執行的任何代碼。

private string textBoxText; 
public string TextBoxText 
{ 
    get { return textBoxText; } 
    set 
    { 
     // Setter will be called only 500 milliseconds after the user has entered text. 
     if (textBoxText != value) 
     { 
      textBoxText = value; 
      RaisePropertyChanged("TextBoxText"); 

      // Handle text change. 
      DoStuff(); 
     } 
    } 
} 

編輯:

如果您希望在屬性中的代碼被改變的延遲也發生了,你可以使用類似的解決方案在這裏提到的某些東西:Timer to fire an event WPF

+0

感謝您的建議。但是我無法在TextProperty Change事件中使用它。因爲文本可以由程序在內部進行更改。所以這裏的事件處理程序只有在文字變化通過寫入纔會發生。這就是爲什麼我需要與keydown事件合作。 – ifti24 2014-09-27 14:10:38

+0

@ ifti24請參閱我的編輯 – 2014-09-27 14:15:16

+0

我想我沒有讓你明白目的。我有一個TextBox,並且在每個Keypress的TextBox中都有一個命令綁定。 Binded方法調用視圖和視圖從數據庫中獲取數據。但我不希望每個按鍵都會調用綁定的方法。我想,如果用戶停止鍵入一定的時間(如500毫秒),只有綁定的方法將被調用。 – ifti24 2014-09-27 14:42:23

0

設置一個定時器和超時事件

private System.Timers.Timer keypressTimer = new System.Timers.Timer(); 
    keypressTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

在超時事件內部執行您的任務 -

private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     keypressTimer.Stop(); 
     App.Current.Dispatcher.Invoke((Action)delegate 
     { 

      //CALL YOUR EVENT HERE 

     }); 

    } 

每次按鍵 - 您需要按以下方式重置計時器。

if (delayTime > 0) 
      { 
       keypressTimer.Interval = delayTime; 
       keypressTimer.Start(); 
      }