El siguiente código (del libro Programming WPF de Chris Sell e Ian Griffiths) valida todas las reglas de enlace en un objeto de dependencia y sus hijos:
public static class Validator
{
public static bool IsValid(DependencyObject parent)
{
// Validate all the bindings on the parent
bool valid = true;
LocalValueEnumerator localValues = parent.GetLocalValueEnumerator();
while (localValues.MoveNext())
{
LocalValueEntry entry = localValues.Current;
if (BindingOperations.IsDataBound(parent, entry.Property))
{
Binding binding = BindingOperations.GetBinding(parent, entry.Property);
foreach (ValidationRule rule in binding.ValidationRules)
{
ValidationResult result = rule.Validate(parent.GetValue(entry.Property), null);
if (!result.IsValid)
{
BindingExpression expression = BindingOperations.GetBindingExpression(parent, entry.Property);
System.Windows.Controls.Validation.MarkInvalid(expression, new ValidationError(rule, expression, result.ErrorContent, null));
valid = false;
}
}
}
}
// Validate all the bindings on the children
for (int i = 0; i != VisualTreeHelper.GetChildrenCount(parent); ++i)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (!IsValid(child)) { valid = false; }
}
return valid;
}
}
Puede llamar a esto en su botón Guardar, haga clic en el controlador de eventos de esta manera en su página / ventana
private void saveButton_Click(object sender, RoutedEventArgs e)
{
if (Validator.IsValid(this)) // is valid
{
....
}
}
IsValid
función? Veo que ha configurado unaCanExecute
que supongo que está relacionada con el comando del botón Guardar. ¿Funcionará esto si no estoy usando comandos? ¿Y cómo se relaciona el botón con los otros controles que deben verificarse? Mi único pensamiento sobre cómo usar esto es llamandoIsValid
a cada control que necesita ser validado. Editar: Parece que está validando elsender
que espero que sea el botón Guardar. Eso no me parece correcto.Window
también es un objeto de dependencia. Probablemente lo esté configurando con algún tipo de controlador de eventos en elWindow
. Alternativamente, puede llamarlo directamenteIsValid(this)
desde laWindow
clase.