wpf Datagrid强制datagrid行评估

时间:2018-07-10 08:25:09

标签: c# wpf validation datagridview

我有一个具有行验证属性的 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。

您知道如何实现吗?

1 个答案:

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

希望对您有帮助。