我的Textbox
有KeyDown
个事件。此事件与ViewModel中的事件处理程序绑定。以下是示例代码:
<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中写入,就会调用ViewModel中的后端事件处理程序。但我不想为每个KeyDown操作调用事件处理程序。我想在用户开始在文本框中键入时调用事件处理程序并停止至少N毫秒。这意味着我需要为事件设置延迟计时器。任何人都可以指导我如何在MVVM中实现这一目标吗?
答案 0 :(得分:5)
您可以使用BindingBase.Delay
属性:
<TextBox x:Name="textBox" Text="{Binding TextBoxText, Delay=500, UpdateSourceTrigger=PropertyChanged}" />
这将在用户更改视图模型后仅500毫秒修改TextBoxText
属性。然后,在您的设置器中,您可以调用任何您想要执行的代码。
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
答案 1 :(得分:1)
设置计时器和超时事件
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();
}