使用ValidationRules进行验证-“确定”按钮应触发验证,而不是继续执行

本文关键字:验证 继续 执行 按钮 ValidationRules 确定 使用 | 更新日期: 2023-09-27 18:27:04

我有一个简单的示例应用程序,两个文本框,一个验证规则和一个按钮。我希望我的按钮触发验证,如果它无效,就不要继续执行。

<TextBox>
    <TextBox.Text>
        <Binding Path="FirstName">
            <Binding.ValidationRules>
                <local:MyValidationRule ErrorMessage="Enter first name" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
<TextBox>
    <TextBox.Text>
        <Binding Path="LastName">
            <Binding.ValidationRules>
                <local:MyValidationRule ErrorMessage="Enter last name" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
<Button Command="{Binding OkCommand}" Content="Ok" />

验证规则:

public class MyValidationRule : ValidationRule
{
    public string ErrorMessage { get; set; }
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string valueToCheck = value as string;
        if (string.IsNullOrWhiteSpace(valueToCheck))
        {
            return new ValidationResult(false, ErrorMessage);
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}

My OkCommand为空方法:

  OkCommand= new RelayCommand(OkRequested);
  private void OkRequested()
    {
        // Do stuff
    }

然而,无论文本框是否为空,OkCommand都会正确执行。我在这里做错了什么?如果文本框无效,我希望它们被设置样式(我已经从示例中排除了样式),但这并没有发生。

使用ValidationRules进行验证-“确定”按钮应触发验证,而不是继续执行

您应该在OkCommand中添加这样的内容。其他文本框也是如此。

if ( Validation.GetHasError( textBox1 ) )
{
    MessageBox.Show( Validation.GetErrors( textBox1 )[0].ErrorContent.ToString() );
    return;
}