WPF:验证与转换器

pmf*_*pmf 14 c# validation wpf

使用转换器,我可以区分至少4种与源值更新有关的行为:

  • 转换为适当的值( - >更新源)
  • 返回null( - >表示错误)
  • 抛出异常并激活异常验证规则( - >表示错误)
  • 返回Binding.DoNothing( - >不更新源,但不指示错误eiter)

使用a ValidationRule,我只能区分成功( - >更新源)和失败( - >不更新源),但我无法模拟与之关联的行为Binding.DoNothing

有没有办法以ValidationRule类似于Binding.DoNothing转换器行为的方式使用?

Tod*_*ang 8

Converters和ValidationRules的意图非常不同.转换器获取一个值并将其转换为另一个值.你提到的4个案例足以转换:做到这一点; 说它是空的; 爆炸; 忽视.但是ValidationRules是/不是 - 它们是有效的,或者它们不是.虽然有一个"忽略"选项可能是有意义的,但没有一个.

最接近语义的是IsValid = true在构造函数中设置,但它并不是你想要的.

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{
    try
    {
        // try normal setup/validation
    } 
    catch 
    {
        // handle exceptions, return false
    }
    // decide if you want to return false
    // return true (equivalent to nothing/ignore)
    return new ValidationResult(true, null);
}
Run Code Online (Sandbox Code Playgroud)

最后的想法是,如果你需要特殊情况,那么try-catch或其他逻辑就会爆炸.我唯一能想到的是ValidationRule中的类型检查,由于您创建了一个不合需要的依赖项,但是它可以绕过这些问题,这是非常可疑的.即

if (value is SpecialType)
{
    return new ValidationResult(true, null);
}
Run Code Online (Sandbox Code Playgroud)

HTH!

更新

或者怎么样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>
Run Code Online (Sandbox Code Playgroud)