示例#1
0
        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);
        }
示例#2
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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
            }
        }