使用WPF验证规则并禁用"保存"按钮

Sco*_*ttG 28 validation wpf validationrules

在单击"保存"按钮之前,我有一个页面,其中几个文本框不能为空.

<TextBox...

                <TextBox.Text>
                    <Binding Path ="LastName" UpdateSourceTrigger="PropertyChanged">

                        <Binding.ValidationRules>
                            <local:StringRequiredValidationRule />
                        </Binding.ValidationRules>                              
                    </Binding>
                </TextBox.Text>
Run Code Online (Sandbox Code Playgroud)

我的规则有效.我的文本框周围有一个红色边框,直到我输入一个值.所以现在我想将此验证规则添加到我的其他文本框中.

现在,如何在页面没有错误之前禁用"保存"按钮?我不知道要检查什么是否有任何验证错误.

Dev*_*per 18

以下是您需要的完整示例.

http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/

https://skydrive.live.com/?cid=2c6600f1c1d5e3be&id=2C6600F1C1D5E3BE%21203

在此输入图像描述

  • 将答案中的关键部分放在一边会很棒.如果引用的网站消失,这个答案就没用了. (10认同)
  • 问题是关于如何在使用ValidationRules时禁用按钮.但是引用的示例是关于使用IDataErrorInfo - 另一种验证方式. (8认同)
  • 遗憾的是,引用的示例没有详细描述按钮的启用/禁用. (5认同)

Chr*_*oph 17

在视图的代码隐藏中,您可以像这样连接Validation.ErrorEvent;

this.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(OnErrorEvent)); 
Run Code Online (Sandbox Code Playgroud)

然后

private int errorCount;
private void OnErrorEvent(object sender, RoutedEventArgs e)
{
    var validationEventArgs = e as ValidationErrorEventArgs;
    if (validationEventArgs  == null)
        throw new Exception("Unexpected event args");
    switch(validationEventArgs.Action)
    {
        case ValidationErrorEventAction.Added:
            {
                errorCount++; break;
            }
        case ValidationErrorEventAction.Removed:
            {
                errorCount--; break;
            }
        default:
            {
                throw new Exception("Unknown action");
            }
    }
    Save.IsEnabled = errorCount == 0;
}
Run Code Online (Sandbox Code Playgroud)

这假设您将收到删除通知(如果您删除有问题的元素,则不会发生这种情况).

  • 要通知错误,我必须在需要验证的元素上添加`NotifyOnValidationError =“ True”`:`&lt;Binding Path =“ LastName” UpdateSourceTrigger =“ PropertyChanged” NotifyOnValidationError =“ True”&gt;`(默认值为`false`)。 (2认同)

Tod*_*ite 8

您想使用Validation.HasError附加属性.

沿着同样的路线,Josh Smith在没有创建调试Spew的情况下Binding to(Validation.Errors)[0]进行了有趣的阅读.

  • 请问一些细节?也许以代码的形式? (6认同)
  • 您没有回答"如何禁用"保存"按钮".请提供代码.您引用的示例"绑定到(Validation.Errors)[0]而不创建调试Spew".没有任何代码可以禁用"保存"按钮. (4认同)