Следующий код (из книги «Программирование WPF» Криса Селла и Яна Гриффитса) проверяет все правила привязки для объекта зависимости и его дочерних элементов:
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;
}
}
Вы можете вызвать это в обработчике события нажатия кнопки сохранения, например, на своей странице / в окне
private void saveButton_Click(object sender, RoutedEventArgs e)
{
if (Validator.IsValid(this)) // is valid
{
....
}
}
IsValid
функцию? Я вижу, вы настроили команду,CanExecute
которая, как я полагаю, связана с командой кнопки «Сохранить». Будет ли это работать, если я не использую команды? И как кнопка связана с другими элементами управления, которые необходимо проверить? Я думал только о том, как использовать это, вызываяIsValid
каждый элемент управления, который необходимо проверить. Изменить: похоже, вы подтверждаете,sender
что я ожидаю, что это кнопка сохранения. Мне это кажется неправильным.Window
также является объектом зависимости. Я, вероятно, настраивает его с помощью какого-то обработчика событий наWindow
. В качестве альтернативы вы можете просто вызвать его напрямуюIsValid(this)
изWindow
класса.