验证规则与WPF中的行为

本文关键字:WPF 规则 验证 | 更新日期: 2023-09-27 18:23:44

假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用ValidationRule检查用户输入的内容,并通过XAML将其绑定到文本属性,或者我可以创建一个新行为并将其附加到控件(而不是通过绑定)。

两者上的XAML示例:

行为:<TextBox behaviors:DigitsOnlyBehavior.IsDigitOnly="True"/>

绑定到Window的Text属性的ValidationRule

<TextBox>
    <TextBox.Text>
        <Binding RelativeSource = "{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
            <Binding.ValidationRules>
                <utils:RestrictInputTypeValidator Restriction="IntegersOnly" ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

这些方法的优点和缺点是什么?我什么时候应该使用它们?还是这是一个偏好问题?

验证规则与WPF中的行为

对于行为,我喜欢并期待一个没有错误的"积极"场景/工作流。重点是没有错误。用户很快就会意识到,当他们在具有Numeric行为的TextBox中键入"a"时,它不会接受它,它是一个数字文本框,这就是它的工作方式。

对于Validation,焦点似乎更多地集中在错误上。我可以有一个数字文本框,但我也不接受超过100的数字,如果你键入"101",我会告诉你这是不可接受的。这里的重点是通过抛出验证错误来引导用户了解什么是不可接受的。

行为优势:

  • 通过输入错误的数据进行预防(你不会让用户朝自己的脚开枪)
  • 模型保持干净。TextBox的Binding甚至没有命中setter,因为行为阻止了它,因此没有用PropertChanges或ValidationErrors等触发XAML

行为劣势:

-可能会令人困惑,因此如果您设置不接受"101"的逻辑,则没有默认的方法来指导用户。