public static IObservable <TProperty> ObserveProperty <TSource, TProperty>(this TSource source, Expression <Func <TSource, TProperty> > propertyExpression, bool observeInitialValue = false) where TSource : INotifyPropertyChanged { return(Observable.Create <TProperty>(observer => { var propertyName = GetPropertyName(propertyExpression); var selector = CompiledExpressionHelper <TSource, TProperty> .GetFunc(propertyExpression); var observable = Observable.FromEventPattern <PropertyChangedEventHandler, PropertyChangedEventArgs>(h => source.PropertyChanged += h, h => source.PropertyChanged -= h) .Where(evt => evt.EventArgs.PropertyName == propertyName) .Select(_ => selector(source)); return (observeInitialValue ? observable.StartWith(selector(source)) : observable).Subscribe(observer); })); }
public static IObservable <TProp> ObserveProperty <TSource, TProp>(this TSource source, Expression <Func <TSource, TProp> > propertyExpression, bool observeInitialValue) where TSource : INotifyPropertyChanged { return(Observable.Create <TProp>(o => { var propertyName = GetPropertyName(source, propertyExpression); var selector = CompiledExpressionHelper <TSource, TProp> .GetFunc(propertyExpression); var observable = from evt in Observable.FromEvent <PropertyChangedEventHandler, PropertyChangedEventArgs>( h => (s, e) => h(e), h => source.PropertyChanged += h, h => source.PropertyChanged -= h) where evt.PropertyName == propertyName select selector(source); observable = observeInitialValue ? observable.StartWith(selector(source)) : observable; return observable.Subscribe(o); })); }