private bool RemoveDependencyInternal(Action <string> action) { var toRemove = new List <PropertyPathElement>(); foreach (var value in Dependency) { var propertyRules = value.Value; for (int j = 0; j < propertyRules.Count; j++) { if (propertyRules[j].Action == action) { propertyRules.RemoveAt(j); j--; } } if (propertyRules.Count == 0) { toRemove.Add(value.Key); } } foreach (var key in toRemove) { Dependency.Remove(key); } foreach (var kp in SubtreeDependency) { var node = kp.Value; if (node.RemoveDependency(action)) { toRemove.Add(kp.Key); } } foreach (var key in toRemove) { SubtreeDependency.Remove(key); } if (Dependency.Count == 0) { // Unsubscribe from event foreach (var target in Targets.Values) { foreach (var t in target) { UnwireObject(t); UnwireCollectionObject(t); } } } return(SubtreeDependency.Count == 0 && Dependency.Count == 0); }
void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { NotifyRules(e.PropertyName); DependencyNode property; if (SubtreeDependency.TryGetValue(e.PropertyName, out property)) { property.Resubscribe(new[] { GetPropertyObject(sender, e.PropertyName) }, sender); } }
void OnCollectionElementChanged(object sender, PropertyChangedEventArgs e) { var propertyName = "$" + e.PropertyName; NotifyRules(propertyName); DependencyNode property; if (SubtreeDependency.TryGetValue(propertyName, out property)) { property.Resubscribe(new[] { GetPropertyObject(sender, e.PropertyName) }, sender); } }
private void AddPropertyDependencyInternal(IEnumerable <PropertyPathElement> propertyPath, ActionWithTag actionWithTag) { var propertyName = propertyPath.First(); // Add property dependency PropertyPathElement propertyPathElement = propertyName; Dependency.GetOrAdd(propertyPathElement).Add(actionWithTag); if (propertyPath.Count() > 1) { var dp = SubtreeDependency.GetOrAdd(propertyPathElement); dp.AddPropertyDependencyInternal(propertyPath.Skip(1), actionWithTag); } }