假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用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>
这些方法的优点和缺点是什么?我什么时候应该使用它们?还是这是一个偏好问题?
对于行为,我喜欢并期待一个没有错误的"积极"场景/工作流。重点是没有错误。用户很快就会意识到,当他们在具有Numeric行为的TextBox中键入"a
"时,它不会接受它,它是一个数字文本框,这就是它的工作方式。
对于Validation,焦点似乎更多地集中在错误上。我可以有一个数字文本框,但我也不接受超过100的数字,如果你键入"101
",我会告诉你这是不可接受的。这里的重点是通过抛出验证错误来引导用户了解什么是不可接受的。
行为优势:
- 通过输入错误的数据进行预防(你不会让用户朝自己的脚开枪)
- 模型保持干净。TextBox的Binding甚至没有命中setter,因为行为阻止了它,因此没有用PropertChanges或ValidationErrors等触发XAML
行为劣势:
-可能会令人困惑,因此如果您设置不接受"101"的逻辑,则没有默认的方法来指导用户。