C# WPF中的ValidationRule与行为
假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用ValidationRule检查用户输入的任何内容并通过XAML将其绑定到文本属性,或者我可以创建一个新行为并将其附加到控件(而不是通过绑定) 这两个平台上的XAML示例: 行为:C# WPF中的ValidationRule与行为,c#,wpf,xaml,behavior,validationrule,C#,Wpf,Xaml,Behavior,Validationrule,假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用ValidationRule检查用户输入的任何内容并通过XAML将其绑定到文本属性,或者我可以创建一个新行为并将其附加到控件(而不是通过绑定) 这两个平台上的XAML示例: 行为: 绑定到窗口文本属性的ValidationRule <TextBox> <TextBox.Text> <Binding RelativeSource = "{Relativ
绑定到窗口文本属性的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>
这些方法的优点和缺点是什么?我应该什么时候使用它们?或者这是一个偏好的问题?对于我喜欢的行为,我期望没有错误的“积极”场景/工作流程。重点是没有错误。用户很快就会发现,当他们在文本框中键入一个带有数字行为的“
a
”时,它不会接受它,它是一个数字文本框,这就是它的工作方式
通过验证,重点似乎更多地放在错误上。我可以有一个数字文本框,但我也不接受超过100的数字,如果您键入“101
”,我会告诉您这是不可接受的。这里的重点是通过抛出验证错误来引导用户进入不可接受的领域
行为优势:
- 通过输入错误数据进行预防(您不会让用户射中自己的脚)
- 模型保持干净。TextBox的绑定甚至不会命中setter,因为行为会阻止它,因此不会使用PropertChanges或ValidationErrors等触发XAML
-可能会令人困惑,因此如果您将逻辑设置为不接受“101”,则没有默认的方法来指导用户 我不确定这两种行为优势是否都列出了。据我所知,使用验证规则,您还可以通过“不点击setter”来防止输入坏数据并保持模型干净。我已经多次使用验证规则,它具有我所需要的所有功能。我看到的唯一缺点是:如何在ViewModel中知道所有字段是否有效?您可以使用Validation.Error=“onfielvalidationerror”(但这是一个自定义解决方案)解决此问题。如果验证失败,则不会更新属性。因此,即使使用ValidationRules,模型仍然是干净的。好吧,除了将填充的验证错误,如果您对其进行查询/触发,那么模型是不干净的……为什么不继续呢?