WPF冗长的验证方案

时间:2010-08-03 12:51:59

标签: wpf validation

  • 在我的场景中,我有一个Linq2SQL数据后端。
  • 我的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将是最佳选择。我会调查一下......

2 个答案:

答案 0 :(得分:1)

我终于找到了实现我想要的方法。

使用BindingGroup工作,但我删除了我的解决方案,因为我需要的是一种在正确的文本框中显示Validationerror的方法。

我现在使用附加属性这样做,我读出执行“保存”功能。然后我手动验证并在文本框上设置ValidationError。这样,文本框可以保留其PropertyChanged UpdateSourceTrigger,并且在提交时完成冗长的验证。

答案 1 :(得分:0)

对于它的价值,需要潜在任意时间的验证(例如通过网络与数据库交谈)是一种验证形式,不需要实时反映在UI中。如果你可以这样工作(预先缓存将在你需要之前从数据库中读取它们将检查的值,例如),那就更好了,但这是一个在报告错误之后报告错误的情况。用户提交的数据通常是可以接受的,只要您不破坏用户输入的信息即可。