WPF ValidationRules不会在加载时激发

本文关键字:加载 ValidationRules WPF | 更新日期: 2023-09-27 18:25:03

我在一个文本框上有一个ValidationRules

<TextBox Margin="5,5,5,0" Name="myTextBox" >
<Binding Path="myID" NotifyOnValidationError="True" ValidatesOnDataErrors="True" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"  >
    <Binding.ValidationRules>
        <local:ValueCannotBlankValidator ValidatesOnTargetUpdated="True"  />
    </Binding.ValidationRules>
</Binding>

现在,如果用户更改了文本框中的值,这将起作用。它不能在负载下启动的问题。认为将UpdateSourceTrigger="PropertyChanged"更改为UpdateSourceTrigger="LostFocus"是一个简单的修复方法,但这会导致ValidationRules不启动。谢谢你的帮助。

WPF ValidationRules不会在加载时激发

如果设置UpdateSourceTrigger="LostFocus",则当输入焦点设置为另一个控件时会进行验证,另一方面,UpdateSourceTrigger="PropertyChanged"在每次更改文本时都会触发,其行为非常类似于TextBox的TextChanged事件。

ValidatesOnTargetUpdated="True"确保文本在加载时得到验证,XAML代码是正确的。如果您在ValueCannotBlankValidator.Validate方法中设置了一个断点,您可能会发现它实际上是在加载时激发的。

我怀疑您的验证器在第一次验证时是否返回valid结果,此时TextBox的Text属性为null,如果将nullstring.Empty ("")进行比较,则会得到不正确的结果。

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    ValidationResult trueResult = new ValidationResult(true, "not blank");
    string str = value as string; //value is null on load, don't compare it against ""
    if (string.IsNullOrEmpty(str))
        return new ValidationResult(false, "blank");
    else
        return trueResult;
}