如何在行验证规则 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 数据网格期间读取当前编辑的值的主要内容,如果未能解决你的问题,请参考以下文章