WPF中的ValidationRule与行为

时间:2013-07-18 15:55:03

标签: c# wpf xaml behavior validationrule

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

两者的XAML示例:

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

ValidationRule绑定到Window的Text属性

<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>

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

1 个答案:

答案 0 :(得分:0)

使用行为我喜欢并期望“积极”的场景/工作流程没有错误。重点是没有错误。用户可以非常快速地在TextBox中键入“a”时使用数字行为而不接受它,这是一个数字文本框,这就是它的工作原理。

通过验证,重点似乎更多地放在错误上。我可以有一个数字文本框,但如果你输入“101”,我也不会超过100,我告诉你这是不可接受的。这里的重点是通过抛出验证错误来引导用户进入不可接受的范围。

行为优势:

  • 通过输入错误数据预防(您不会让用户自己在脚中射击)。
  • 模特保持清洁。 TextBox的Binding甚至没有击中setter,因为行为阻止了它,因此,没有使用PropertChanges或ValidationErrors等触发回XAML。

行为缺点:

- 可能会让人感到困惑,所以如果你让逻辑不接受'101',就没有默认的方式来引导用户。