65.9K
CodeProject 正在变化。 阅读更多。
Home

带延迟绑定的文本框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (15投票s)

2009 年 10 月 2 日

CPOL

2分钟阅读

viewsIcon

46161

downloadIcon

1198

一个文本框, 在用户停止输入后等待用户定义的间隔时间以更新其绑定源

引言

今天我发现自己正在编写一个搜索界面,我正在搜索大量数据,并希望用户只需键入他们的搜索查询,而不必点击一个按钮来执行搜索。 起初,我尝试使用直接的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 毫秒。 一旦达到,框下面的文本将被更新。

screenshot.png

关注点

DelayedbindingTextBox中对OnTextChanged方法的重写值得一提,只是为了看看带有封闭的对委托方法的调用的匿名方法。 匿名方法非常强大,并且可能与我读过的任何代码一样令人困惑。

历史

  • 09/01/10: 初始发布
  • 09/05/10: 进行了更改以处理在更新之前textbox被卸载或绑定信息更改的情况。 由于此控件使用线程,因此存在计时器到期之前绑定可能变为无效的可能性。
© . All rights reserved.