This can be easily implemented using the Reactive Extensions Throttle () method in combination with the observed property.
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 }
Used as follows:
// wire query observable var queryActual = new ObservablePropertyBacking<string>(); queryActual.Throttle(TimeSpan.FromMilliseconds(300)).Subscribe(DoSearch);
Implementation Property:
string query; public string Query { get { return query; } set { queryActual.Value = value; } }
source share