如何将更新推迟到WPF中的绑定

时间:2009-01-29 13:12:01

标签: wpf data-binding

在使用新属性值更新Source之前,是否有一种简单的方法可以告诉双向WPF数据绑定在最后一次更改后等待几毫秒?

我正在为ListBox实现一个过滤器功能,我有一个文本框,我想根据我输入的内容过滤ListBox的内容。我正在使用数据绑定将各个部分连接起来。过滤列表可能非常耗时,因此我不希望在每个键入的字符之后执行此操作:因此我的请求。

我一直在使用Paul Stovell的DelayBinding Extension(此时他的网站已关闭,所以我无法链接到它)。但是,我怀疑它是我的应用程序中内存泄漏的原因(由于它没有删除事件处理程序)。

还有其他人有其他想法吗?

3 个答案:

答案 0 :(得分:15)

我也迟到了几年,但如果您正在为此目的使用WPF 4.5 + there is now an property,则称为Delay

描述

  

更新之前等待的时间(以毫秒为单位)   绑定源。

使用示例

<TextBlock Text="{Binding Name, Delay=500}"/>

答案 1 :(得分:5)

这里的问题有点晚了(仅仅几年:)但对于任何有兴趣的人我在项目中都有类似的要求,所以我创建了两个名为DelayBindingExtensionDelayMultiBindingExtension的标记扩展。< / 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>

DelayBindingDelayMultiBinding的源代码和示例用法可以下载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