2014-09-29 142 views
0

我在文本框上有ValidationRules;WPF验证规则不会在加载时触发

<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不能触发。谢谢您的帮助。

回答

1

如果设置为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; 
}