WPF为什么没有显示错误信息?

时间:2014-10-28 07:16:49

标签: c# wpf xaml

我想在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);
    }
}

问题:

  1. 未显示任何错误消息。实际上,甚至都没有调用NumberValidator。为什么呢?

  2. 如何仅在点击Button时验证错误?

  3. 如何将有效范围(即最小,最大)信息传递给NumberValidator

  4. 谢谢!

1 个答案:

答案 0 :(得分:2)

我假设你想要在源到目标方向上进行验证(为模型错误提供视觉反馈),因此我的答案仅适用于这种情况。

  1. 验证规则仅在设计到源方向上进行检查(这里的主要思想是验证用户输入),因此当您更改模型上的值时,不会检查验证规则。为了在源到目标方向上执行验证,您的模型应该实现IDataErrorInfoINotifyDataErrorInfo(后者仅在.NET 4.5或更新版本中受支持),并且ValidatesOnDataErrors应该在绑定上设置为true

  2. 每当更新绑定时都会进行验证,因此如果按钮单击更新模型上的属性(或者更具体地说,引发PropertyChanged事件),则将执行验证。请注意,如果在某些其他情况下更改了属性,则还将执行验证,因此,只有在按钮单击时才执行验证,请确保仅在此时更改属性(或PropertyChanged)。

  3. 尽管在假设场景中使用ValidationRule衍生词不是合适的方法,但答案是在Max类上定义MinNumberValidator属性,然后像这样在XAML中使用它们:<local:NumberValidator Min="0" Max="100"/>

  4. 有关绑定的详细信息,请参阅Data Binding Overview