public static string GetPropertyName <TSource, TProp>(this TSource source,
                                                              Expression <Func <TSource, TProp> > propertyExpression)
        {
            var memberExpression = CompiledExpressionHelper <TSource, TProp> .GetMemberExpression(propertyExpression);

            return(memberExpression.Member.Name);
        }
        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);
            }));
        }
 private static string GetPropertyName <TSource, TProperty>(Expression <Func <TSource, TProperty> > propertyExpression) where TSource : INotifyPropertyChanged
 {
     return(CompiledExpressionHelper <TSource, TProperty> .GetMemberExpression(propertyExpression).Member.Name);
 }