我使用验证规则如下,
问题是,当值为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 >
答案 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属性设置器中,首先检查该值是否与当前值不同。如果不同,则更新您的值并激活PropertyChanged事件。
这可以解决您的问题。