带延迟绑定的文本框






4.64/5 (15投票s)
一个文本框,
引言
今天我发现自己正在编写一个搜索界面,我正在搜索大量数据,并希望用户只需键入他们的搜索查询,而不必点击一个按钮来执行搜索。 起初,我尝试使用直接的WPF textBox
,并将UpdateSourceTrigger
设置为PropertyChanged
,但这会在每次按键时执行搜索功能,这太慢了。 我想要的是在用户完成输入后执行搜索。
解决方案
我已经派生了一个TextBox
的子类,该子类具有一个属性DelayTime
。 当用户输入按键时,将启动一个计时器,如果计时器在另一个按键之前(以毫秒为单位设置)达到DelayTime
,则会更新DataBinding
源。 在应用程序中,我正在允许用户输入,当他们停止输入时,将执行搜索。 我还包含了一些其他小功能;如果文本框失去焦点,并且按下回车键或换行键时,绑定也将更新。
使用代码
包含的项目显示了如何使用DelayedBindingTextBox
,这基本上与使用TextBox
相同,除了您可以设置DelayTime
(以毫秒为单位)。
<local:DelayedBindingTextBox
DelayTime="500"
Text="{Binding Path=MyTextProperty}" />
如果将Text
属性的绑定设置为UpdateSourceTrigger=PropertyChanged
,则行为将与标准的TextBox
没有区别。
在下面的(非常丑陋 - 我不是设计师)截图中,您可以看到虽然textbox
中的文本已更改为“原始文本已更改”,但下面的文本(代表文本框所绑定的内容)仍然是“原始文本”,因为计时器尚未达到 3886 毫秒。 一旦达到,框下面的文本将被更新。

关注点
DelayedbindingTextBox
中对OnTextChanged
方法的重写值得一提,只是为了看看带有封闭的对委托方法的调用的匿名方法。 匿名方法非常强大,并且可能与我读过的任何代码一样令人困惑。
历史
- 09/01/10: 初始发布
- 09/05/10: 进行了更改以处理在更新之前
textbox
被卸载或绑定信息更改的情况。 由于此控件使用线程,因此存在计时器到期之前绑定可能变为无效的可能性。