4

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

两者上的 XAML 示例:

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

ValidationRule 绑定到窗口的 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>

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

4

1 回答 1

0

对于行为,我喜欢并期待一个没有错误的“积极”场景/工作流程。重点是没有错误。用户很快就会知道,当他们a在 TextBox 中键入一个“不接受它的数字行为”时,它是一个数字文本框,这就是它的工作原理。

使用验证,重点似乎更多地放在错误上。我可以有一个数字文本框,但我也不接受超过 100 的数字,如果你输入 ' 101',我会让你知道这是不可接受的。这里的重点是通过抛出验证错误来引导用户了解不可接受的情况。

行为优势:

  • 通过输入错误数据进行预防(您不要让用户在脚上开枪)。
  • 模型保持清洁。TextBox 的 Binding 甚至不会命中 setter,因为行为会阻止它,因此,不会使用 PropertChanges 或 ValidationErrors 等触发返回的 XAML。

行为劣势:

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

于 2013-07-18T17:08:39.527 回答