代码之家  ›  专栏  ›  技术社区  ›  Markus Hütter

WPF冗长的验证场景

  •  0
  • Markus Hütter  · 技术社区  · 15 年前
    • 在我的场景中,我有一个Linq2SQL数据后端。
    • 我的数据对象实现IDataErrorInfo来捕获错误,比如 Name==null

    • 数据对象以树形结构组织,因此每个对象都有一个父对象和子对象

    如何验证所选名称在Dataobjects父对象的子对象下是否唯一?

    我面临的问题是,唯一名称验证需要一个数据库往返,如果 UpdateSourceTrigger="PropertyChanged" 在绑定到名称的文本框上。

    另一方面,我可以 UpdateSourceTrigger="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 似乎在暗示,组建一个团队才是最好的选择。我会调查的。。。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Markus Hütter    15 年前

    我终于想出了一个办法来实现我的愿望。

    BindingGroup的使用起到了作用,但是我精简了我的解决方案,因为我需要的是在正确的文本框中显示Validationerror的方法。

        2
  •  0
  •   Greg D    15 年前

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