代码之家  ›  专栏  ›  技术社区  ›  Klyse

WPF数据报强制数据报行计算

  •  0
  • Klyse  · 技术社区  · 7 年前

    我有一个 数据表格控件 具有行验证属性的:

    <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的未评估结果。

    你知道如何做到这一点吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Klyse    7 年前

    我现在找到了自己的答案:

    DataGridRow 有一个 BindingGroup . 有关更多信息,请参阅 here .

    每当 BindingGroup.CommitEdit() 调用,则执行验证。

    注意我已经设置了 ValidationStep CommittedValue 在XAML行验证标记中。

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

    希望有帮助。