public CompositePathGetter ( IEnumerable <IBindingPathLink <object> > pathLinks, PropertyType defaultValue ) { _pathLinks = pathLinks; _defaultValue = defaultValue; if (pathLinks.IsNullOrEmpty()) { PropGetters.Add(new SimplePropGetter <object>()); return; } IObjWithPropGetter <object> previousPropGetter = null; foreach (var pathLink in _pathLinks) { IObjWithPropGetter <object> propGetter = pathLink.CreateGetter(); PropGetters.Add(propGetter); if (previousPropGetter != null) { IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter; previousPropGetter.PropertyChangedEvent += () => { propGetter.TheObj = thePreviousPropGetter.GetPropValue(); }; } previousPropGetter = propGetter; } previousPropGetter.PropertyChangedEvent += () => { if (this.PropertyChangedEvent == null) { return; } if (!LastPropGetter.HasObj) { _cachedValue.TheValue = _defaultValue; } else { _cachedValue.TheValue = (PropertyType)LastPropGetter.GetPropValue(); } PropertyChangedEvent?.Invoke(); }; }
public CompositePathSetter(IEnumerable <IBindingPathLink <object> > pathLinks) { IBindingPathLink <object> theSetterPathLink = pathLinks.Last(); TheSetter = theSetterPathLink.CreateSetter(); PropGetters = pathLinks .TakeWhile((pathLink) => (!Object.ReferenceEquals(pathLink, theSetterPathLink))) .Select((pathLink) => pathLink.CreateGetter()) .ToList(); IObjWithPropGetter <object> previousPropGetter = null; foreach (var propGetter in PropGetters) { IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter; if (previousPropGetter != null) { thePreviousPropGetter.PropertyChangedEvent += () => { propGetter.TheObj = thePreviousPropGetter.GetPropValue(); }; } previousPropGetter = propGetter; } if (previousPropGetter != null) { IObjWithPropGetter <object> thePreviousPropGetter = previousPropGetter; // set the last property getter to the set the setter previousPropGetter.PropertyChangedEvent += () => { TheSetter.TheObj = thePreviousPropGetter.GetPropValue(); }; } }