/// <summary> /// </summary> /// <param name="parentManager"></param> /// <param name="dependentPropertyName">Name of the depending property</param> public NotificationChain(NotificationChainManager parentManager, String dependentPropertyName) { parentManager.ThrowIfNull("parentManager"); dependentPropertyName.ThrowIfNull("dependentPropertyName"); ParentManager = parentManager; DependentPropertyName = dependentPropertyName; myFireCallbacksCallback = (sender, notifyingProperty, dependentProperty) => Execute(sender, notifyingProperty); }
/// <summary> /// Creates a new NotificationChainManager for the given property, or returns an existing instance /// </summary> /// <typeparam name="T0"></typeparam> /// <typeparam name="T1"></typeparam> /// <param name="propGetter"></param> /// <returns></returns> internal NotificationChainManager CreateOrGetManager <T0, T1> (Expression <Func <T0, T1> > propGetter) where T0 : INotifyPropertyChanged where T1 : class { var propName = propGetter.GetPropertyOrFieldName(); NotificationChainManager mgr; if (!myDeepChainManagers.TryGetValue(propName, out mgr)) { mgr = myDeepChainManagers[propName] = new NotificationChainManager(); myDeepChainGetters[propName] = parent => propGetter.Compile().Invoke((T0)parent); } return(mgr); }
// TODO consolidate CreateOrGetDeepManager methods? Only diff is propGetter /// <summary> /// Creates a new NotificationChainManager for the given property, or returns an existing instance /// </summary> /// <typeparam name="T1"></typeparam> /// <param name="propGetter"></param> /// <returns></returns> internal NotificationChainManager CreateOrGetManager <T1> (Expression <Func <T1> > propGetter) where T1 : class { var propName = propGetter.GetPropertyOrFieldName(); NotificationChainManager mgr; if (!myDeepChainManagers.TryGetValue(propName, out mgr)) { myDeepChainManagers[propName] = mgr = new NotificationChainManager(); myDeepChainGetters[propName] = _ => propGetter.Compile().Invoke(); var currentValue = (T1)myDeepChainGetters[propName] (null); if (currentValue != null) { mgr.Observe(currentValue); } } return(mgr); }