private static void UpdateParent(this DependencyObject source, IEnumerable <ValidationError> removed, IEnumerable <ValidationError> added)
        {
            if (source == null)
            {
                return;
            }

            var parent = VisualTreeHelper.GetParent(source) as FrameworkElement;

            if (parent == null || GetForInputTypes(parent) == null)
            {
                return;
            }

            var childNode  = GetNode(source) as ErrorNode;
            var parentNode = GetNode(parent) as ErrorNode;

            if (childNode == null)
            {
                return;
            }

            if (IsScopeFor(parent, source))
            {
                if (parentNode == null)
                {
#pragma warning disable IDISP001, CA2000 // Dispose created. Disposed in SetNode.
                    parentNode = new ScopeNode(parent);
#pragma warning restore IDISP001, CA2000 // Dispose created.
                }

                parentNode.ChildCollection.TryAdd(childNode);
                parentNode.ErrorCollection.Remove(removed);
                parentNode.ErrorCollection.Add(added.Where(e => parent.IsScopeFor(e)).AsReadOnly());
                SetNode(parent, parentNode);
            }
            else
            {
                if (parentNode == null)
                {
                    return;
                }

                parentNode.ChildCollection.Remove(childNode);
                parentNode.ErrorCollection.Remove(removed);
                parentNode.ErrorCollection.Remove(childNode.Errors);
                if (parentNode is ScopeNode &&
                    parentNode.Errors.Count == 0)
                {
                    SetNode(parent, ValidNode.Default);
                }
            }
        }
Пример #2
0
        internal static void Notify(ErrorNode errorNode)
        {
            var source = errorNode.Source;

            if (source == null)
            {
                return;
            }

            Scope.SetHasErrors(source, errorNode.HasErrors);
            var  parent    = VisualTreeHelper.GetParent(source);
            Node childNode = errorNode;

            while (parent != null)
            {
                if (Scope.GetForInputTypes(parent) == null)
                {
                    break;
                }

                var parentNode = (Node)parent.GetValue(Scope.ErrorsProperty);
                if (ShouldRemoveChildNode(parentNode, childNode))
                {
                    parentNode.RemoveChild(childNode);
                    if (parentNode is ScopeNode && parentNode.Children.Count == 0)
                    {
                        Scope.SetErrors(parent, null);
                    }
                    else
                    {
                        parentNode.RefreshErrors();
                    }
                }
                else if (ShouldAddChildNode(parent, childNode, source))
                {
                    if (parentNode == null)
                    {
                        parentNode = new ScopeNode(parent, childNode);
                        Scope.SetErrors(parent, parentNode);
                    }
                    else
                    {
                        parentNode.AddChild(childNode);
                        parentNode.RefreshErrors();
                    }
                }

                Scope.SetHasErrors(parent, parentNode?.HasErrors == true);
                childNode = parentNode;
                parent    = VisualTreeHelper.GetParent(parent);
            }
        }
        private static void UpdateParent(this DependencyObject source, IEnumerable<ValidationError> removed, IEnumerable<ValidationError> added)
        {
            if (source == null)
            {
                return;
            }

            var parent = VisualTreeHelper.GetParent(source) as FrameworkElement;
            if (parent == null || GetForInputTypes(parent) == null)
            {
                return;
            }

            var childNode = GetNode(source) as ErrorNode;
            var parentNode = GetNode(parent) as ErrorNode;
            if (childNode == null)
            {
                return;
            }

            if (IsScopeFor(parent, source))
            {
                if (parentNode == null)
                {
                    parentNode = new ScopeNode(parent);
                }

                parentNode.ChildCollection.TryAdd(childNode);
                parentNode.ErrorCollection.Remove(removed);
                parentNode.ErrorCollection.Add(added.Where(e => parent.IsScopeFor(e)).AsReadOnly());
                SetNode(parent, parentNode);
            }
            else
            {
                if (parentNode == null)
                {
                    return;
                }

                parentNode.ChildCollection.Remove(childNode);
                parentNode.ErrorCollection.Remove(removed);
                parentNode.ErrorCollection.Remove(childNode.Errors);
                if (parentNode is ScopeNode && parentNode.Errors.Count == 0)
                {
                    SetNode(parent, ValidNode.Default);
                }
            }
        }