将WPF验证集成到MVVM中

时间:2011-05-27 16:18:13

标签: c# wpf mvvm

我有一些正常工作的ValidationRules。我只是想知道将它与我的ViewModel集成的最佳方法是什么。

我有一个(过于简单的)方法-AhasAnyErrors,它会控制树检查错误,但我不确定如何将这些结果暴露给我的ViewModel。换句话说,如果我有一个只能在没有验证错误的情况下才能执行的ICommand,我该怎么办?

我能想到的最好的只是处理按钮的click事件,然后在没有错误的情况下手动调用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 个答案:

答案 0 :(得分:2)

据推测,您可以确定它们是否是针对视图模型本身的任何验证方法而不是使用Validation.GetErrors() - 如果您正在实现IDataErrorInfo,那么它可能会更简单。

如果是这种情况,您可以在按钮绑定的命令的CanExecute方法中考虑视图模型的验证状态。

答案 1 :(得分:2)

您可能对 WPF Application Framework (WAF) BookLibrary 示例应用感兴趣。 BookView.xaml.cs类显示了如何将WPF验证状态与基础ViewModel同步。

在示例中,它用于解析错误。在这个具体的情况下,当用户在Pages TextBox中输入'abc'时会出现解析错误。页面绑定为整数值,因此无法解析“abc”。