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); } } }
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); } } }