我有一个具有行验证属性的 DataGridView :
<DataGrid ItemsSource="{Binding SetupXml.Files.FileList}">
<DataGrid.RowValidationRules>
<vm:FileServerValidation ValidationStep="CommittedValue"/>
</DataGrid.RowValidationRules>
</DataGrid>
每当用户在DataGridView中更改(并提交)值时,我的 ValidationRule 就会被调用:
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的 ErrorStatus 。
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,而是仅为已更改的那些行调用。这样,如果某行中的某些数据是通过主详细信息部分插入的,则可能未对某些行进行求值,并且 Validation.GetHasError 将返回未求值的结果,默认为true。>
您知道如何实现吗?
答案 0 :(得分:0)
我现在找到了自己的答案:
每个DataGridRow
都有一个BindingGroup
。有关更多信息,请参见here。
只要调用BindingGroup.CommitEdit()
,验证就会执行。
请注意,我已经在xaml行验证标签中将ValidationStep
设置为CommittedValue
。
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;
if (!(evaluateItem is DataGridRow dgr)) continue;
dgr.BindingGroup.CommitEdit();
valid &= !System.Windows.Controls.Validation.GetHasError(evaluateItem);
}
return !valid;
}
希望对您有帮助。