1

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

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)视图模型将不知道该值已更新(使用无效字符串)。它将保持其旧值。
  • 3) 因此,任何将启用的“保存”按钮绑定到IsValid 属性的尝试都将失败。(如第 2 条所述)(糟糕!)

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

4

1 回答 1

2

这里有一篇非常好的文章正好解决了这个问题——我使用了这种方法,效果很好。

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

这是引用自链接文章的代码:

公共类 ValidationScope
{
    公共静态 IList GetErrors(DependencyObject obj)
    {
        返回 (IList)obj.GetValue(ErrorsProperty);
    }

    公共静态无效 SetErrors(DependencyObject obj,IList 值)
    {
        obj.SetValue(错误属性,值);
    }

    公共静态只读 DependencyProperty ErrorsProperty =
        DependencyProperty.RegisterAttached("错误", typeof(IList), typeof(ValidationScope),
        新的 PropertyMetadata(null, ErrorsChanged));

    公共静态无效错误更改(DependencyObject obj,DependencyPropertyChangedEventArgs args)
    {
        FrameworkElement 元素 = (FrameworkElement)obj;
        element.BindingValidationError += 委托(对象发送者,ValidationErrorEventArgs e)
            {
                如果(e.Action == ValidationErrorEventAction.Added)
                {
                    GetErrors(obj).Add(e.Error);
                }
                别的
                {
                    GetErrors(obj).Remove(e.Error);
                }
            };
    }
}

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

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

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

于 2013-05-16T21:16:36.853 回答