请考虑以下情况:有一个组合框和一个筛选器文本框,然后用户在文本框中键入文本 组合框项目源使用筛选器文本进行更新。一切正常,但过滤发生在每个键入的字母上。我想在过滤发生之前添加延迟(用户键入时不应用过滤器)。最简单的方法是什么?
最常用的方法是引入一个计时器,每次用户输入新字符时,您的时间跨度都会重置,但如果它超过 x 秒,则执行代码。
请记住异步,以便如果用户在您执行搜索时再次开始键入,您可以取消异步调用,因为该信息现在已过时。
如果您使用的是视图模型,只需将textbox1_TextChanged更改为相应的属性资源库
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (!tmr.Enabled)
{
tmr.Enabled = true;
tmr.Start();
}
TimeSinceType = DateTime.Now;
}
public DateTime TimeSinceType { get; set; }
protected void Load()
{
tmr = new Timer();
tmr.Interval = 200;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
}
void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
if ((DateTime.Now - TimeSinceType).Seconds > .5)
{
Dispatcher.BeginInvoke((Action)delegate()
{
//LoadData();
tmr.Stop();
});
}
}
现在,通过直接在绑定上放置延迟,可以更轻松地完成此操作:
<ComboBox Text={Binding MyBinding, Delay=200} />