我的Dataobjects实现了IDataErrorInfo以捕获Name==null
之类的错误(快速执行只需要值的Validationrules,到目前为止没什么特别的)
Dataobjects以树形结构组织,因此每个都有父母和子女
如何在Dataobjects'Farent的子项下验证所选名称是否唯一?
我面临的问题是,唯一的名称验证需要数据库往返,如果TextBox绑定到名称上的UpdateSourceTrigger="PropertyChanged"
,就会滞后输入。
另一方面,我可以设置UpdateSourceTrigger="LostFocus"
,但问题是,我启用/禁用有效/无效数据上的“保存”按钮。现在处于无效状态,你无法单击“保存”按钮,因此文本框无法丢失焦点进行更新(只有标签显示哪些是丑陋的,但LostFocus还有更多“不可用”(例如,错误在打字时不断显示)从而改变名称。)
理想的是一种说明个别验证规则适用于不同事件的方式:
<TextBox Grid.Column="1">
<TextBox.Text>
<Binding Path="Foldername">
<Binding.ValidationRules>
<wpfresources:UniqueChildValidationRule ValidationStep="UpdatedValue" **UpdateSourceTrigger="LostFocus"**>
... stuff here ...
</wpfresources:UniqueChildValidationRule>
<DataErrorValidationRule **UpdateSourceTrigger="PropertyChanged"**/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
解决这个问题的最佳方法是什么?
修改
This MSDN article似乎暗示,BindingGroup将是最佳选择。我会调查一下......
答案 0 :(得分:1)
我终于找到了实现我想要的方法。
使用BindingGroup工作,但我删除了我的解决方案,因为我需要的是一种在正确的文本框中显示Validationerror的方法。
我现在使用附加属性这样做,我读出执行“保存”功能。然后我手动验证并在文本框上设置ValidationError。这样,文本框可以保留其PropertyChanged UpdateSourceTrigger,并且在提交时完成冗长的验证。
答案 1 :(得分:0)
对于它的价值,需要潜在任意时间的验证(例如通过网络与数据库交谈)是一种验证形式,不需要实时反映在UI中。如果你可以这样工作(预先缓存将在你需要之前从数据库中读取它们将检查的值,例如),那就更好了,但这是一个在报告错误之后报告错误的情况。用户提交的数据通常是可以接受的,只要您不破坏用户输入的信息即可。