带有延迟的自定义UpdateSourceTrigger?

9
我想创建一个自定义的UpdateSourceTrigger版本,以便在绑定时使用。我不知道这是否可能,或者我是否需要创建自己的绑定类。我所期望的是,在失去焦点或属性更改之外,有一种方式可以在指定的时间限制后更新源。
我找到了这个,但我不知道是否有更好的方法(其中一个评论提到了实现中的一些内存泄漏)。
有什么想法吗?
3个回答

21

谢谢...那是一个不错的功能,肯定可以胜任工作,但我们将会使用4.0更长一段时间。 - Thelonias
这是完美的方法!谢谢。 - Mohammed A. Fadil

5
我会建议您将此操作体现在视图模型中,而不是在绑定层面执行。当属性更改时,重新启动一个DispatcherTimer。当计时器过期时,启动逻辑即可。就这么简单。

0

这可以很容易地通过使用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;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接