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

How to read current edited value during Row Validation Rule WPF datagrid

我有这个验证规则:

 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);
    }

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

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

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

供参考 CheckCircularReference 只是检查 Dteq.Tag == Dteq.FedFrom 是否直接或通过parent/child 关系的完整树。

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;
    }

提前致谢。

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

XAML 错误行为:

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

XAML 行为正确:

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