我想在Text
TextBlock
TextBlock xaml:
<TextBlock x:Name="numInput" Validation.ErrorTemplate="{StaticResource errorTemplate}" >
<TextBlock.Text>
<Binding Path="Text" RelativeSource="{RelativeSource self}" NotifyOnValidationError="True">
<Binding.ValidationRules>
<local: NumberValidator />
</Binding.ValidationRules>
</Binding>
</TextBlock.Text>
</TextBlock>
通过GUI中的一些按钮点击(即触摸屏)在代码隐藏中添加Text
errorTemplate
<ControlTemplate x:Key="errorTemplate">
<StackPanel>
<TextBlock Foreground="Red">error msg</TextBlock>
<AdornedElementPlaceholder/>
</StackPanel>
</ControlTemplate>
的NumberValidator
class NumberValidator : ValidationRule {
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) {
Console.WriteLine("validating numbers!!");
int num = -1;
try {
num = Int32.Parse(value.ToString());
}
catch (Exception e) {
return new ValidationResult(false, "input must be numbers!");
}
if (num > 999 || num < 1) {
return new ValidationResult(false, string.Format("must be integers from {0} to {1}", 1, 999));
}
return new ValidationResult(true, null);
}
}
问题:
未显示任何错误消息。实际上,甚至都没有调用NumberValidator
。为什么呢?
如何仅在点击Button
时验证错误?
如何将有效范围(即最小,最大)信息传递给NumberValidator
?
谢谢!
答案 0 :(得分:2)
我假设你想要在源到目标方向上进行验证(为模型错误提供视觉反馈),因此我的答案仅适用于这种情况。
验证规则仅在设计到源方向上进行检查(这里的主要思想是验证用户输入),因此当您更改模型上的值时,不会检查验证规则。为了在源到目标方向上执行验证,您的模型应该实现IDataErrorInfo
或INotifyDataErrorInfo
(后者仅在.NET 4.5或更新版本中受支持),并且ValidatesOnDataErrors
应该在绑定上设置为true
。
每当更新绑定时都会进行验证,因此如果按钮单击更新模型上的属性(或者更具体地说,引发PropertyChanged
事件),则将执行验证。请注意,如果在某些其他情况下更改了属性,则还将执行验证,因此,只有在按钮单击时才执行验证,请确保仅在此时更改属性(或PropertyChanged
)。
尽管在假设场景中使用ValidationRule
衍生词不是合适的方法,但答案是在Max
类上定义Min
和NumberValidator
属性,然后像这样在XAML中使用它们:<local:NumberValidator Min="0" Max="100"/>
。
有关绑定的详细信息,请参阅Data Binding Overview。