返回true时,验证规则堆栈溢出异常

时间:2014-01-29 07:45:31

标签: c# wpf validation xaml

我使用验证规则如下,

问题是,当值为true时,如果我键入 aa或LastName (这是正确的值,我返回 true )我得到以下错误,如果我在文本框中输入了一些错误值 no 错误(我看到红色寄宿生),知道我想念的是什么吗?

  

“System.StackOverflowException”类型的未处理异常

目前的情况是,如果我不使用 ValidatesOnTargetUpdated =“True”,则没有红色寄宿生..

遵循验证规则

public class PropertiesMapValidation : ValidationRule
        {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
            {
            bool isValid = true;
            var list = new List<String> { "aa", "LastName", "BusinessItem", "BusinessItems" };
            var val = (string)value;
            if (val != null)
                {


            ValidationResult result = null;
            result = isValid
                         ? new ValidationResult(true, null)
                         : new ValidationResult(false,
                                                "The Field are not match");
            return result;
            }
        }

xaml

    <TextBox x:Name="FirstName" Grid.Column="4" Margin="0,50,0,0"  Grid.Row="2" Style="{StaticResource tooltipError}" Height="24" Width="148">
        <TextBox.Text>
            <Binding ElementName="FirstName" Path="Text" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules  >

1 个答案:

答案 0 :(得分:1)

如果您想要一个空字符串的错误,您需要修复if语句:

            if (!string.IsNullOrEmpty(mappedProperty))
            {
                foreach (string item in list)
                {
                    if (item != mappedProperty)
                    {
                        isValid = false;
                    }
                    else
                    {
                        isValid = true;
                        break;
                    }
                }
            }
            else
            {
                isValid = false;
            }

但是,您的代码可以通过将上面的代码替换为:

来使用更多声明性语法
isValid = !string.IsNullOrEmpty(mappedProperty)
    && list.Contains(mappedProperty);

否则,逻辑似乎有效。例外情况似乎来自其他事情。

更新

文本框绑定到FirstName属性。 当用户在TextBox中输入新值时,它会自动将FirstName.Text属性更改为新值(在变量之后)。这导致源更新。然后验证器重新验证并重新更新源,导致无限循环 - 堆栈溢出。

  • 用户输入有效值
  • 更新FirstName(UpdateSourceTrigger =&#34; PropertyChanged&#34;)
  • FirstName = value(Property Setter)
  • 触发了FirstName属性更改事件
  • TextBox将自身更新为新值
  • TextBox重新验证(ValidatesOnTargetUpdated =&#34; True&#34;)
  • TextBox再次更新FirstName
  • 无尽的循环

在FirstName属性设置器中,首先检查该值是否与当前值不同。如果不同,则更新您的值并激活PropertyChanged事件。

这可以解决您的问题。