private static IObservable <T> ObserveFullPropertyPathCore <TNotifier, TProperty, T>(this TNotifier source, NotifyingPath <TNotifier, TProperty> notifyingPath, Func <object, PropertyChangedEventArgs, T> create, bool signalInitial = true) where TNotifier : class, INotifyPropertyChanged { if (signalInitial) { return(Observable.Return( create( notifyingPath.SourceAndValue(source) .Source, CachedEventArgs.GetOrCreatePropertyChangedEventArgs(string.Empty))) .Concat(source.ObserveFullPropertyPathCore(notifyingPath, create, signalInitial: false))); } return(Observable.Create <T>( o => { #pragma warning disable IDISP001 // Dispose created. var tracker = notifyingPath.CreateTracker(source); #pragma warning restore IDISP001 // Dispose created. void Handler(object sender, PropertyChangedEventArgs e) => o.OnNext(create(sender, e)); foreach (var propertyTracker in tracker) { propertyTracker.TrackedPropertyChanged += Handler; } return Disposable.Create( () => { foreach (var propertyTracker in tracker) { propertyTracker.TrackedPropertyChanged -= Handler; } tracker.Dispose(); }); })); }