如何在行验证规则 WPF 数据网格期间读取当前编辑的值

Posted

技术标签:

【中文标题】如何在行验证规则 WPF 数据网格期间读取当前编辑的值【英文标题】:How to read current edited value during Row Validation Rule WPF datagrid 【发布时间】:2022-01-15 11:05:14 【问题描述】:

我有这个验证规则:

 public override ValidationResult Validate(object value, CultureInfo cultureInfo) 

        DteqModel Dteq = (value as BindingGroup).Items[0] as DteqModel;

        if (CheckCircularReference(Dteq, Dteq.FedFrom)) 
            return new ValidationResult(false, "Equipment cannot be fed from itself");
        

        return new ValidationResult(true, null);
    

这是作为 DataGrid 上的 RowValidaiton 应用的,它正在工作,但不是 100% 符合预期。 Dteq.FedFrom 是一个组合框,验证作用于行/单元格中的前一个值,而不是我当前在 RowEndEdit 之后输入的值。看来验证是在将值保存到实际集合对象之前完成的。我在所有对象上使用 NotifyProperty 更改,并且数据网格中的集合是可观察的集合。

DteqModel Dteq = (value as BindingGroup).Items[0] 

如何让上面的行读取当前在行中的数据?现在如果我输入一个无效的结果,我必须进入两次编辑模式才能使失败的验证生效。之后,我无法将其更改回任何有效值,因为它总是导致验证失败并且不会更新值。

作为参考,CheckCircularReference 只是检查是否 Dteq.Tag == Dteq.FedFrom,直接或通过父/子关系的完整树。

private bool CheckCircularReference(DteqModel startDteq, string nextDteq, int counter =1) 
        var dteqDict = Dictionaries.dteqDict;
        if (nextDteq == "" & counter == 1)  // sets the initial FedFrom
            nextDteq = startDteq.FedFrom;
        

        if (dteqDict.ContainsKey(nextDteq) == false || nextDteq == "" || counter > dteqDict.Count)  // all equipment has been checked
            return false;
        
        else if (startDteq.FedFrom == startDteq.Tag)  // if the equipment is fed from itself
            return true;
        
        else if (dteqDict.ContainsKey(nextDteq)) 
            if (dteqDict[nextDteq].FedFrom == startDteq.Tag)  // if the equipment is indirectly fed from itself
                return true;
            
            counter += 1;
            return CheckCircularReference(startDteq, dteqDict[nextDteq].FedFrom, counter); // if not increase the count and check the next Equipment
        
        
        return false;
    

提前致谢。

【问题讨论】:

【参考方案1】:

我必须向我的 XAML 添加验证步骤。

具有错误行为的 XAML:

<DataGrid.RowValidationRules>
    <rules:InvalidFedFromRule ValidatesOnTargetUpdated="True"/>
</DataGrid.RowValidationRules>

具有正确行为的 XAML:

<DataGrid.RowValidationRules>
    <rules:InvalidFedFromRule ValidatesOnTargetUpdated="True" ValidationStep="CommittedValue"/>
</DataGrid.RowValidationRules>

【讨论】:

以上是关于如何在行验证规则 WPF 数据网格期间读取当前编辑的值的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid 全行编辑

WPF 数据绑定和验证规则最佳实践

C# WPF 工具包:如何​​使数据网格中的单元格可编辑?

如何在 devexpress 中向表单字段添加动态验证规则

CakePHP 3自定义验证:如何在编辑期间将新值与旧值进行比较?

如何在行单击时用数据填充指定的详细信息网格