在使用新属性值更新Source之前,是否有一种简单的方法可以告诉双向WPF数据绑定在最后一次更改后等待几毫秒?
我正在为ListBox实现一个过滤器功能,我有一个文本框,我想根据我输入的内容过滤ListBox的内容。我正在使用数据绑定将各个部分连接起来。过滤列表可能非常耗时,因此我不希望在每个键入的字符之后执行此操作:因此我的请求。
我一直在使用Paul Stovell的DelayBinding Extension(此时他的网站已关闭,所以我无法链接到它)。但是,我怀疑它是我的应用程序中内存泄漏的原因(由于它没有删除事件处理程序)。
还有其他人有其他想法吗?
答案 0 :(得分:15)
我也迟到了几年,但如果您正在为此目的使用WPF 4.5 + there is now an property,则称为Delay
。
描述
更新之前等待的时间(以毫秒为单位) 绑定源。
使用示例
<TextBlock Text="{Binding Name, Delay=500}"/>
答案 1 :(得分:5)
这里的问题有点晚了(仅仅几年:)但对于任何有兴趣的人我在项目中都有类似的要求,所以我创建了两个名为DelayBindingExtension
和DelayMultiBindingExtension
的标记扩展。< / p>
它们的工作方式与普通Bindings
相同,但您可以指定UpdateSourceDelay
和/或UpdateTargetDelay
,这两者都是TimeSpan
属性。另外,我已经验证它是无泄漏的(它通过继承上下文而不是DependencyPropertyDescriptor
使用来利用依赖属性绑定的propertychanged回调。)
DelayBinding
<TextBox Text="{db:DelayBinding Path=TextProperty,
UpdateSourceTrigger=PropertyChanged,
UpdateSourceDelay='00:00:01'}"/>
对于DelayMultiBinding
<cs:ColorSelector.SelectedColor>
<db:DelayMultiBinding Mode="TwoWay"
Converter="{StaticResource ColorConverter}"
UpdateSourceDelay="00:00:02"
UpdateTargetDelay="00:00:01">
<Binding Path="Red" />
<Binding Path="Green" />
<Binding Path="Blue" />
</db:DelayMultiBinding>
</cs:ColorSelector.SelectedColor>
DelayBinding
和DelayMultiBinding
的源代码和示例用法可以下载here。
如果您对实施细节感兴趣,可以在此处查看我的博客文章:DelayBinding and DelayMultiBinding with Source and Target delay
答案 2 :(得分:2)
首先,为了回答你的问题,我会添加UpdateSourceTrigger绑定扩展,让你可以控制绑定何时更新。首先尝试LostFocus,但听起来你可能想要使用Explicit。
其次,如果您的过滤需要很长时间,我会考虑在ListBox上使用CollectionViewSource。 Bea Stollnitz有一个很好的入门书here,我使用this blog post向我展示了如何过滤。当我改变时,我注意到与其他实现的速度差异很大,即使它们使用相同的过滤功能。如果您绑定的列表发生更改,CollectionViewSource也会自动处理更新过滤的项目,即使在项目级别上,如果您绑定到ObservableCollection(这是我更改为CollectionViewSource的原始原因)。
HTH