转换器和验证规则的意图非常不同。转换器将一个值转换为另一个值。你提到的四种情况足以满足转换需求:执行转换、表示为空、抛出异常、忽略。然而,验证规则是二元的 - 它们要么有效,要么无效。尽管可能有“忽略”选项,但实际上并没有这个选项。
从语义上讲,最接近的方法是在构造函数中设置
IsValid = true
,但这并不完全符合你的需求。
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
try
{
}
catch
{
}
return new ValidationResult(true, null);
}
我最后想说的是,如果你需要特殊情况处理,而try-catch或其他逻辑会崩溃。我唯一能想到的是在ValidationRule中进行类型检查,但这非常可疑,因为你正在创建一个不必要的依赖项,但可以避免问题。即:
if (value is SpecialType)
{
return new ValidationResult(true, null);
}
希望这能对你有所帮助!
更新内容
或者试试使用IgnorableValidationRule
?
public class IgnorableValidationRule : ValidationRule
{
public bool Ignore { get; set; } = false;
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (Ignore) return new ValidationResult(true, null);
return new ValidationResult(false, "Why does everyone ignore me?");
}
}
<TextBox.Text>
<Binding Path="Data">
<Binding.ValidationRules>
<local:IgnorableValidationRule Ignore="True"/> <!-- na na -->
</Binding.ValidationRules>
</Binding>
</TextBox.Text>