是否有一种在XAML中应用Binding.ValidationRules的简洁方法

时间:2012-04-13 15:53:41

标签: wpf xaml data-binding

我正在研究WPF / XAML中某些数据输入表单的验证规则。通过将验证规则明确应用于字段绑定,我已经能够获得我想要的用户体验:

<Binding 
        Path="qtyoffset"
        NotifyOnValidationError="True"
        ValidatesOnDataErrors="True"
        UpdateSourceTrigger="PropertyChanged"
        >
    <Binding.ValidationRules>
        <utility:DecimalValidationRule precision="1" />
    </Binding.ValidationRules>
</Binding>

通过上述操作,每次按键都会验证该字段。如果用户输入“X”,则该字段立即被标记为无效,错误消息显示在适当的位置,“提交”按钮立即被禁用,等等。所有美观和光滑。如果用户在小数点后输入两位数,输入两个小数点等,则会发生同样的事情。

我唯一的问题是冗长。需要为每个字段提供上述绑定代码,如果在一个字段上不完全正确,那么一个字段将不能正常工作。我宁愿只指定绑定路径,并自动添加其余部分。在每个绑定上设置NotifyOnValidationError,ValidatesOnDataErrors和UpdateSourceTrigger,根据绑定的类型设置适合特定数据类型的验证规则。或者,至少,根据我在XAML中指定的类型。

我正在考虑在JQuery中进行验证的方式。我没有静态列出每个输入元素的所有验证规则,而是设置了许多类。然后,在加载时,我将使用JQuery的DOM搜索功能来查找具有特定类集的每个输入元素,并动态添加适当的验证功能。

XAML提供了一种使用样式和设置器为显示元素提供这种简洁配置的非常好的方法。但这对Bindings不起作用。

有合理的选择吗?

2 个答案:

答案 0 :(得分:3)

简短回答:不,不是真的。

但是你可以做两件事:

  • 你可以把

        NotifyOnValidationError="True"
        ValidatesOnDataErrors="True"
        UpdateSourceTrigger="PropertyChanged"
    

在资源中并将其作为StaticResource访问,以分解冗余信息,然后您可以在一个位置更改所有这些属性。

  • 您可以根据Binding创建自己的markup extension。这样可以缩短XAML声明。您可以使用它:<TextBox Text={local:DecimalBinding Path=qtyoffset} />

HTH,

巴布。

答案 1 :(得分:0)

这可能对你的需求来说有点过分了,但是你可以做的一件事是继承WPF UserControl,然后在加载UserControl时编写一个函数,并在应用新绑定时编写一个函数,这样可以查看可视树对于相关类型的绑定,并将验证应用于它们。