WPF: 验证 vs. 转换器

15

通过转换器,我可以区分至少4种关于源值更新的行为类型:

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

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

是否有一种方法可以使用 ValidationRule 以类似于转换器的 Binding.DoNothing 行为的方式?


你想要绑定不被更新,同时UI元素的样式也不被改变吗? - Yusuf Tarık Günaydın
1个回答

8
转换器和验证规则的意图非常不同。转换器将一个值转换为另一个值。你提到的四种情况足以满足转换需求:执行转换、表示为空、抛出异常、忽略。然而,验证规则是二元的 - 它们要么有效,要么无效。尽管可能有“忽略”选项,但实际上并没有这个选项。
从语义上讲,最接近的方法是在构造函数中设置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);
}

我最后想说的是,如果你需要特殊情况处理,而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>

1
在哪种情况下忽略一个 ValidationRule 才有意义? - Domysee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接