I did not find an easy way to do this. I found some code around the traps to recursively go through all the controls on the form and determine if they have validation errors. I turned it into an extension method:
// Validate all dependency objects in a window internal static IList<ValidationError> GetErrors(this DependencyObject node) { // Check if dependency object was passed if (node != null) { // Check if dependency object is valid. // NOTE: Validation.GetHasError works for controls that have validation rules attached bool isValid = !Validation.GetHasError(node); if (!isValid) { // If the dependency object is invalid, and it can receive the focus, // set the focus if (node is IInputElement) Keyboard.Focus((IInputElement)node); return Validation.GetErrors(node); } } // If this dependency object is valid, check all child dependency objects foreach (object subnode in LogicalTreeHelper.GetChildren(node)) { if (subnode is DependencyObject) { // If a child dependency object is invalid, return false immediately, // otherwise keep checking var errors = GetErrors((DependencyObject)subnode); if (errors.Count > 0) return errors; } } // All dependency objects are valid return new ValidationError[0]; }
So, when the user clicks the "Save" button on the form, I do this:
var errors = this.GetErrors(); if (errors.Count > 0) { MessageBox.Show(errors[0].ErrorContent.ToString()); return; }
This is much more than it should be, but using the extension method simplifies it a bit.
Matt hamilton
source share