【问题标题】:Is there a concise way of applying Binding.ValidationRules in XAML是否有在 XAML 中应用 Binding.ValidationRules 的简洁方法
【发布时间】:2012-04-13 15:53:41
【问题描述】:

我正在研究 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。

有没有合理的替代方案?

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    简短回答:不,不是。

    但是你可以做两件事:

    • 你可以放

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

    在资源中并以StaticResource 访问它们,以排除冗余信息,然后您可以在一个地方更改所有这些属性。

    • 您可以根据 Binding 创建自己的markup extension。这将使 XAML 声明更短。你可以像这样使用它:&lt;TextBox Text={local:DecimalBinding Path=qtyoffset} /&gt;

    HTH,

    巴布。

    【讨论】:

      【解决方案2】:

      这可能对您的需求有点过头了,但是您可以做的一件事是继承 WPF UserControl,然后在加载 UserControl 以及应用新绑定时编写一个函数,该函数沿着可视化树查找用于相关类型的绑定并对其应用验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        • 2016-11-30
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多