WPF验证:如何验证整个页面

时间:2013-05-16 20:57:42

标签: wpf validation mvvm

我使用以下文章来验证用户的输入:

http://weblogs.asp.net/monikadyrda/archive/2009/06/24/wpf-textbox-validation.aspx http://weblogs.asp.net/monikadyrda/archive/2009/07/28/wpf-textbox-validation-2.aspx

我有一个包含100多个文本框的窗口,我需要检查所有文本框是否有效。

想象一下以下情况 - >用户输入了无效值:

  • 1)验证规则将验证错误并显示错误 消息(好!)
  • 2)viewmodel不知道该值有 已更新(使用无效字符串)。它将保持旧的 值。
  • 3)因此,任何尝试将“保存”按钮绑定到IsValid 财产将失败。 (如第2条所述)(不好!)

所以,我的问题是:如何在视图模型中验证整个页面?

1 个答案:

答案 0 :(得分:2)

有一篇非常好的文章here正好处理这个问题 - 我使用了这种方法,而且效果很好。

基本思想是使用附加属性 - 称之为“ValidationScope.Errors” - 将视图的验证范围绑定到视图模型中的属性。

以下是链接文章引用的代码:


public class ValidationScope
{
    public static IList GetErrors(DependencyObject obj)
    {
        return (IList)obj.GetValue(ErrorsProperty);
    }

    public static void SetErrors(DependencyObject obj, IList value)
    {
        obj.SetValue(ErrorsProperty, value);
    }

    public static readonly DependencyProperty ErrorsProperty =
        DependencyProperty.RegisterAttached("Errors", typeof(IList), typeof(ValidationScope), 
        new PropertyMetadata(null, ErrorsChanged));

    public static void ErrorsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        FrameworkElement element = (FrameworkElement)obj;
        element.BindingValidationError += delegate(object sender, ValidationErrorEventArgs e)
            {
                if (e.Action == ValidationErrorEventAction.Added)
                {
                    GetErrors(obj).Add(e.Error);
                }
                else
                {
                    GetErrors(obj).Remove(e.Error);
                }
            };
    }
}

您可以通过侦听框架的BindingValidationError事件以及向指定的视图模型目标添加/删除错误来查看此附加的依赖项属性。要在代码中使用它,只需将依赖项属性ValidationScope.Errors绑定到视图模型中的目标属性:

<my:SomeUserControl my:ValidationScope.Errors="{Binding MyViewModel.Errors}" />

现在,您的视图模型包含一个属性“错误”,可用于检查视图是否实际有效。