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

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

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

有什么想法吗?

【问题讨论】:

    标签: wpf data-binding binding updatesourcetrigger


    【解决方案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。当计时器到期时,启动你的逻辑。就这么简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        • 2023-02-11
        • 2015-03-27
        • 2012-04-28
        • 1970-01-01
        相关资源
        最近更新 更多