У меня есть некоторые ValidationRules, которые работают правильно. Мне просто интересно, как лучше всего интегрировать это с моей ViewModel.
У меня есть (слишком простой) метод - HasAnyErrors - который обходит дерево элементов управления, проверяя наличие ошибок, но я не уверен, как представить эти результаты моей ViewModel. Другими словами, что мне делать, если у меня есть ICommand, который может выполняться только при отсутствии ошибок проверки?
Лучшее, что я мог придумать, это просто обработать событие нажатия кнопки, а затем вручную вызвать команду ViewModel, если не было ошибок.
private void Button_Click_RunCommand(object sender, RoutedEventArgs e) {
if (this.HasAnyErrors())
return;
(this.DataContext as SomeViewModel).SomeCommand.Execute(null);
}
Это не самое элегантное решение; но похоже на работу. Есть ли более элегантное решение?
BREAK
Для полноты здесь приведены методы валидации (большинство из них будут методами расширения слишком долго). Они (кажется) работают нормально, но я уверен, что по крайней мере кто-то спросит, как они выглядят.
bool HasAnyErrors() {
List<string> errors = new List<string>();
GetErrors(this, errors);
return errors.Any();
}
void GetErrors(DependencyObject obj, List<string> errors) {
foreach (UIElement child in LogicalTreeHelper.GetChildren(obj).OfType<UIElement>()) {
if (child is TextBox)
AddErrorIfExists(child as UIElement, errors);
GetErrors(child, errors);
}
}
private void AddErrorIfExists(UIElement element, List<string> errors) {
if (Validation.GetHasError(element))
errors.Add(Validation.GetErrors(element)[0].ErrorContent.ToString());
}