我在文本框上有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
无法触发。谢谢你的帮助。
答案 0 :(得分:1)
如果设置UpdateSourceTrigger="LostFocus"
,则在将输入焦点设置为另一个控件时进行验证,另一方面,每次更改文本时都会触发UpdateSourceTrigger="PropertyChanged"
,其行为非常类似于TextBox&#39; s TextChanged事件。
ValidatesOnTargetUpdated="True"
确保在加载时验证文本,您的XAML代码是正确的。如果在ValueCannotBlankValidator.Validate
方法中设置断点,您可能会发现它实际上是在加载时触发的。
我怀疑你的验证器在第一次验证时返回valid
结果,那时TextBox的Text属性为null
,如果你将null
与string.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;
}