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

Sam*_*ack 8 data-binding wpf

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

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

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

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

Joã*_*ela 17

我也迟到了几年,但是如果你使用的是WPF 4.5+ ,现在有一个属于这个目的的属性,它被称为Delay.

描述

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

用法示例

<TextBlock Text="{Binding Name, Delay=500}"/>
Run Code Online (Sandbox Code Playgroud)


Fre*_*lad 5

这里的问题有点晚了(仅仅几年:)但是对于任何有兴趣的人我在项目中有类似的要求所以我创建了两个标记扩展名为DelayBindingExtensionDelayMultiBindingExtension.

它们可以正常工作Bindings,您可以指定添加UpdateSourceDelay和/或UpdateTargetDelay两者都是TimeSpan属性.此外,我已经验证它是无泄漏的(它通过继承上下文而不是使用依赖属性绑定的propertychanged回调DependencyPropertyDescriptor).

用法的示例用法 DelayBinding

<TextBox Text="{db:DelayBinding Path=TextProperty,
                                UpdateSourceTrigger=PropertyChanged,
                                UpdateSourceDelay='00:00:01'}"/>
Run Code Online (Sandbox Code Playgroud)

对于一个 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>
Run Code Online (Sandbox Code Playgroud)

源代码和样本使用情况DelayBinding,并DelayMultiBinding可以下载在这里.
如果您对实现细节感兴趣,可以在这里查看我的博客文章:具有源和目标延迟的DelayBinding和DelayMultiBinding


Bry*_*son 2

首先,为了回答您的问题,我将添加UpdateSourceTrigger绑定扩展,它可以让您控制绑定何时更新。首先尝试 LostFocus,但听起来您可能想要选择 Explicit。

其次,如果您的过滤需要很长时间,我会考虑在您的 ListBox 上使用 CollectionViewSource。Bea Stollnitz在这里有一篇很好的入门读物,我用这篇博客文章向我展示了如何过滤。当我改变时,我注意到与我的其他实现相比,速度存在巨大差异,即使它们使用相同的过滤功能。此外,如果您绑定的列表发生更改,即使您绑定到 ObservableCollection,即使在项目级别上,CollectionViewSource 也会自动处理更新过滤项目(这是我更改为 CollectionViewSource 的最初原因)。

华泰