如何在行验证规则 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>
我有这个验证规则:
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>