public KNKVOKeyPathObserver(Object aBaseObject, String aKeyPath, KNKVOObserver anObserver, KNKeyValueObservingOptions someOptions, Object aContext) { changes = new Stack<KNKVOObservationChangeTracker>(); previousObservations = new ArrayList(); baseObjectRef = new WeakReference(aBaseObject); keyPath = aKeyPath; context = aContext; options = someOptions; observer = anObserver; //this.ObserveValueForKeyPathOfObject(aKeyPath, observedObject, null, context); ResetObservationTree(); if ((options & KNKeyValueObservingOptions.KNKeyValueObservingOptionInitial) == KNKeyValueObservingOptions.KNKeyValueObservingOptionInitial) { Dictionary<String, Object> change = new Dictionary<String, Object>(); if ((options & KNKeyValueObservingOptions.KNKeyValueObservingOptionNew) == KNKeyValueObservingOptions.KNKeyValueObservingOptionNew) { change.SetValueForKey(observedObject.ValueForKeyPath(keyPath), KNKVOConstants.KNKeyValueChangeNewKey); } observer.ObserveValueForKeyPathOfObject(keyPath, observedObject, change, context); } }