【发布时间】:2012-03-21 10:03:49
【问题描述】:
我仍在为 WPF 中的验证而苦苦挣扎。
我有一个自定义验证规则,它要求文本出现在文本框中,即它强制执行强制字段约束。
<TextBox local:Masking.Mask="^[a-zA-Z0-9]*$" x:Name="CameraIdCodeTextBox" Grid.Row="1" Grid.Column="1">
<Binding Path="CameraIdCode" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True" ValidatesOnExceptions="True">
<Binding.ValidationRules>
<localValidation:RequiredFieldRule />
</Binding.ValidationRules>
</Binding>
</TextBox>
问题是,当 Window 首次加载时,TextBox 中没有文本(如您所料)。但是 Text 属性被绑定到 ViewModel 上的属性,因此,验证规则正在触发,表明 Window 存在问题 - 在用户甚至有机会违反业务规则之前。
这是以前解决过的问题吗?我不可能是第一个体验到这一点的人。我敢肯定这对年轻球员来说是个陷阱。
【问题讨论】:
-
你能试试吗... UpdateSourceTrigger="LostFocus"
-
您可以创建一个验证组,并且只有在用户首次更改某个字段时才启用它。
-
@AngelWPF 我试过了。它仍然在窗口加载时验证初始绑定。
-
@VladimirPerevalov 是否可以启用和禁用绑定?如果是这样,我可能应该在第一次加载时禁用绑定。但是我该如何启用它?捕捉用户第一次变化的逻辑,与未来的每一次变化不同,这非常复杂。我不确定为什么简单的RequiredField 验证器如此困难。
-
您可能需要将验证移至集合;因为 set 在初始绑定时不会被调用。或者可能在验证中允许 string.empty 但在集合中拒绝 string.empty; (并引发验证错误)。
标签: wpf validation binding