/// <summary> /// Observes a property that implements INotifyPropertyChanged, and automatically calls DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. /// </summary> /// <typeparam name="T">The object type containing the property specified in the expression.</typeparam> /// <param name="propertyExpression">The property expression. Example: ObservesProperty(() => PropertyName).</param> protected internal void ObservesPropertyInternal <T>(Expression <Func <T> > propertyExpression) { if (_observedPropertiesExpressions.Contains(propertyExpression.ToString())) { throw new ArgumentException($"{propertyExpression.ToString()} is already being observed.", nameof(propertyExpression)); } else { _observedPropertiesExpressions.Add(propertyExpression.ToString()); PropertyObserver.Observes(propertyExpression, RaiseCanExecuteChanged); } }
/// <summary> /// Initiate PropertyObserverNode for a given property expression. /// </summary> /// <param name="propertyExpression">Expression representing property to be observed.</param> /// <param name="action">Action to be invoked when PropertyChanged event occours.</param> /// <param name="propertyObserver">PropertyObserver instance which owns registered event handlers.</param> internal static void Observes(Expression propertyExpression, Action action, PropertyObserver propertyObserver) { new PropertyObserverNode(propertyExpression, action, propertyObserver); }
private PropertyObserverNode(Expression propertyExpression, Action action, PropertyObserver propertyObserver) { _action = action; _propertyObserver = propertyObserver; SubscribeListeners(propertyExpression as MemberExpression); }