Интеграция валидации WPF в MVVM - PullRequest
1 голос
/ 27 мая 2011

У меня есть некоторые 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());
    }

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Вас может заинтересовать BookLibrary пример приложения WPF Application Framework (WAF) . Класс BookView.xaml.cs показывает, как синхронизировать состояние проверки WPF с базовым ViewModel.

В примере используется для анализа ошибок. В этом конкретном случае возникает ошибка синтаксического анализа, когда пользователь вводит abc в TextBox для страниц. Pages привязан к целочисленному значению, поэтому 'abc' не может быть проанализирован.

2 голосов
/ 27 мая 2011

Предположительно, вы могли бы определить, являются ли они какими-либо методами проверки самой модели представления вместо использования Validation.GetErrors() - если вы реализуете IDataErrorInfo, то, вероятно, это будет проще.

Еслив этом случае вы можете принять во внимание состояние проверки модели представления в методе CanExecute команды, к которой привязана кнопка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...