public void Subscribe(object target, Action action) { if (target != null && memberInfo != null) { changeAction = Binding.AddMemberChangeAction(target, memberInfo, i => action()); } }
internal static MemberChangeAction AddMemberChangeAction(object target, MemberInfo member, Action <int> k) { MemberChangeAction sub = null; if (target is INotifyPropertyChanged) { var key = Tuple.Create(target, member); if (objectSubs.TryGetValue(target, out var subs) == false) { subs = new Dictionary <MemberInfo, MemberActions> { { member, new MemberActions(target, member) }, }; objectSubs.Add(target, subs); } // Debug.WriteLine ("ADD CHANGE ACTION " + target + " " + member); sub = new MemberChangeAction(target, member, k); if (subs.ContainsKey(member) == false) { subs.Add(member, new MemberActions(target, member)); } subs[member].AddAction(sub); } return(sub); }
public void RemoveAction(MemberChangeAction action) { actions.Remove(action); if (actions.Count == 0) { UnsubscribeFromChangeNotificationEvent(); } }
/// <summary> /// Add the specified action to be executed when Notify() is called. /// </summary> /// <param name="action">Action.</param> public void AddAction(MemberChangeAction action) { if (actions.Count == 0) { AddChangeNotificationEventHandler(); } actions.Add(action); }
internal static void RemoveMemberChangeAction(MemberChangeAction sub) { if (objectSubs.TryGetValue(sub.Target, out var subs)) { if (subs.TryGetValue(sub.Member, out var memberActions)) { // Debug.WriteLine ("REMOVE CHANGE ACTION " + sub.Target + " " + sub.Member); memberActions.RemoveAction(sub); if (memberActions.Count == 0) { subs.Remove(sub.Member); } } if (subs.Count == 0) { objectSubs.Remove(sub.Target); } } }