自定义 UpdateSourceTrigger 延迟?

Posted

技术标签:

【中文标题】自定义 UpdateSourceTrigger 延迟?【英文标题】:Custom UpdateSourceTrigger with delay? 【发布时间】:2011-12-22 05:48:11 【问题描述】:

我正在寻找可以与我的绑定一起使用的自定义版本的 UpdateSourceTrigger。我不知道这是否可能,或者相反,我只需要创建自己的绑定类。我正在寻找的是,而不是 LostFocus 或 PropertyChanged,它会在某个指定的时间限制后更新源。

我找到了this,但我不知道是否有更好的方法(其中一个 cmets 提到了一些内存泄漏与实现)。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我刚刚注意到 WPF 4.5 有一个延迟属性,有关详细信息,请参阅此链接

http://www.shujaat.net/2011/12/wpf-45-developers-preview-delay-binding.html

【讨论】:

谢谢...这是一个不错的功能,肯定会完成这项工作,但我们将使用 4.0 更长时间。 这是完美的方法!谢谢。【参考方案2】:

这可以使用 Reactive Extensions 的 Throttle() 方法和可观察属性轻松实现。

public class ObservablePropertyBacking<T> : IObservable<T>

  private readonly Subject<T> _innerObservable = new Subject<T>();

  private T _value;

  public T Value
  
    get  return _value; 
    set
    
      _value = value;
      _innerObservable.OnNext(value);
    
  

  #region IObservable<T> Members

  public IDisposable Subscribe(IObserver<T> observer)
  
    return _innerObservable
      .DistinctUntilChanged()
      .AsObservable()
      .Subscribe(observer);
  

  #endregion

这样使用:

// wire query observable
var queryActual = new ObservablePropertyBacking<string>();
queryActual.Throttle(TimeSpan.FromMilliseconds(300)).Subscribe(DoSearch);

实现属性:

string query;

public string Query

  get  return query; 
  set
  
    queryActual.Value = value;
  

【讨论】:

【参考方案3】:

我不会在绑定级别上做这件事,而是会在我的视图模型中显示它。当属性更改时,重新启动 DispatcherTimer。当计时器到期时,启动你的逻辑。就这么简单。

【讨论】:

以上是关于自定义 UpdateSourceTrigger 延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UpdateSourceTrigger 的值移交给 UserControl 或在运行时更新?

带有自定义列的 WPF 数据网格绑定

如何将UpdateSourceTrigger的值移交给UserControl或在运行时更新它?

自定义ViewGroup

WPF + DatePicker + UpdateSourceTrigger = 显式

可以将UpdateSourceTrigger绑定到DependencyProperty吗?