Как продолжить работу, хотя произошла ошибка проверки в DataGridCell? - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы отобразить некоторые значения в DataGrid. Один столбец должен отображать целочисленные значения. Когда пользователь вводит нецифровые символы, я хочу сообщить об этом пользователю, но это значение может сохраняться, хотя. В настоящее время я использую шаблон ValidationTemplate для DataGridRow. Проблема в том, что полная строка ... полная DataGrid больше не редактируется, пока целое значение не будет введено в конкретную ячейку. Как я могу добиться этого, чтобы сообщить пользователю, что он ввел неправильное vlaue, но разрешить это в конце?

Вот стиль, который я сейчас использую:

<Style x:Key="errorRowStyle" TargetType="{x:Type DataGridRow}">
    <Setter Property="ValidationErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <Ellipse Width="12" Height="12" Fill="Red" Stroke="Black" StrokeThickness="0.5"/>
                    <TextBlock FontWeight="Bold" Padding="4,0,0,0" Margin="0" VerticalAlignment="Top" Foreground="White" Text="!" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0]}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Обновление 2018-01-13:

DataGrid: при ошибке проверки ячейки другие ячейки строки недоступны для редактирования / только для чтения

очень близок к моей проблеме, но это не решает проблему, заключающуюся в том, что введенное (недействительное) значение не , введенное в ObservableCollection привязку (twoway) к ячейка с недопустимым (буквенно-цифровым) значением (которое на самом деле является строковым свойством, но валидатор проверяет целочисленное значение), но допустимым целочисленным значением является. (Как я уже говорил: графический интерфейс скорее терпимый, чем ограниченный, он должен дать пользователю подсказку и визуализировать, что введенное значение не соответствует требованиям, но даже это недопустимое значение должно быть принято.)

Может ли валидатор быть причиной ??

namespace ConfigTool.Tools
{
    public class CycleValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value,
            System.Globalization.CultureInfo cultureInfo)
        {
            //DataRowView dataRowView = (value as BindingGroup).Items[0] as DataRowView;
            //string no = Convert.ToString(dataRowView.Row[0]);

            if (int.TryParse(value.ToString(), out int i))
            {
                return new ValidationResult(true, null);
            }
            else
            {
                return new ValidationResult(false,
                    "Cycle should be an integer value.");
            }
        }
    }
}

1 Ответ

0 голосов
/ 15 января 2019

Это помог мне найти решение.

Я изменил свой класс ValidationRule следующим образом:

public class CycleValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)
    {
        BindingGroup group = (BindingGroup)value;
        StringBuilder error = null;
        foreach (var item in group.Items)
        {
            IDataErrorInfo info = item as IDataErrorInfo;
            if (info != null)
            {
                if (!string.IsNullOrEmpty(info.Error))
                {
                    if (error == null)
                    {
                        error = new StringBuilder();
                    }
                    error.Append((error.Length != 0 ? ", " : "") + info.Error);
                }
            }
        }

        if (error != null)
            return new ValidationResult(false, error.ToString());
        else
            return new ValidationResult(true, "");

    }
}

В базовом классе сущностей реализовать IDataErrorInfo следующим образом (извлекать):

string IDataErrorInfo.Error
    {
        get
        {
            StringBuilder error = new StringBuilder();
            if (!int.TryParse(Cycle.ToString(), out int i))
            {
                error.Append("Cycle should be an integer value.");
            }

            return error.ToString();
        }
    }

В файле XAML я добавил

<DataGrid.RowValidationRules>
    <local:CycleValidationRule ValidationStep="UpdatedValue" />
</DataGrid.RowValidationRules>

к сетке данных.

...