我有一个
数据表格控件
具有行验证属性的:
<DataGrid ItemsSource="{Binding SetupXml.Files.FileList}">
<DataGrid.RowValidationRules>
<vm:FileServerValidation ValidationStep="CommittedValue"/>
</DataGrid.RowValidationRules>
</DataGrid>
每当用户更改DataGridView中的值(并提交该值)时,
验证规则
被称为:
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (!(value is BindingGroup bg))
return ValidationResult.ValidResult;
foreach (var item in bg.Items)
{
if (!(item is FileServer c))
continue;
if (string.IsNullOrWhiteSpace(c.FileServerName))
return new ValidationResult(false, "File server name is empty");
if (c.FileServerName.Length < 3)
return new ValidationResult(false, "File server name is to short");
}
return ValidationResult.ValidResult;
}
由于各种原因,每当用户单击
提交
按钮。
因此,我编写了一个函数,
错误状态
所有DataGridRows。
public static bool HasInvalidRows(DataGrid datagrid)
{
var valid = true;
foreach (var item in datagrid.ItemContainerGenerator.Items)
{
var evaluateItem = datagrid.ItemContainerGenerator.ContainerFromItem(item);
if (evaluateItem == null) continue;
valid &= !System.Windows.Controls.Validation.GetHasError(evaluateItem);
}
return !valid;
}
问题是:不是对每一行都调用validationrule,而是只对那些已更改的行调用validationrule。这样,如果一行中的某些数据是通过主细节部分插入的,则可能尚未计算某些行,并且
验证.gethasError
将返回默认为true的未评估结果。
你知道如何做到这一点吗?