Ошибки проверки WPF DataGrid не очищаются - PullRequest
35 голосов
/ 24 февраля 2011

Итак, у меня есть WPF DataGrid, который связан с ObservableCollection.Коллекция имеет проверку на своих членов, через IDataErrorInfo.Если я отредактирую ячейку таким образом, чтобы она была недействительной, а затем отошел от нее перед нажатием клавиши ввода, затем вернусь и сделаю ее действительной, ячейка перестанет показывать недействительную, однако «!»в начале строки все еще будет там, и ToolTip будет ссылаться на предыдущее недопустимое значение.

Ответы [ 14 ]

0 голосов
/ 06 декабря 2013

Я не использую IDataErrorInfo или INotifyDataErrorInfo, и мое решение было изменить мои привязки с UpdateSourceTrigger="PropertyChanged" на UpdateSourceTrigger="LostFocus" Это было единственное, что

Если вы используете ValidationRules в определении столбца DataGrid, и вам нужны правила проверки для запуска при каждом изменении свойства (в пользовательском интерфейсе или свойстве), посмотрите настройку ValidatesOnTargetUpdated="True" на вашем ValidationRule

XAML Пример:

<DataGridTextColumn Header="Name"
    CellStyle="{StaticResource DGCellStyle}"
    ElementStyle="{StaticResource DGTextColValidationStyle}"
    EditingElementStyle="{StaticResource DGTextColEditValidationStyle}">
    <DataGridTextColumn.Binding>
        <Binding Path="Name" UpdateSourceTrigger="LostFocus">
            <Binding.ValidationRules>
                <ValidationResource:YourValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True" />
            </Binding.ValidationRules>
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
0 голосов
/ 06 сентября 2013

В моем случае мне пришлось удалить из связывания определение

UpdateSourceTrigger=PropertyChanged

. Для меня это работает с обоими этими определениями:

<DataGridTextColumn                                         
Header="Time, min" 
x:Name="uiDataGridTextColumnTime"
Width="Auto"                                            
CellStyle="{StaticResource ResourceKey=DataGridCellText}"                                            
IsReadOnly="False">
<DataGridTextColumn.Binding>
    <Binding Path="fTime" StringFormat="{}{0:0.00}">
        <Binding.ValidationRules>
            <Validation:CellDataInfoValidationRule ValidationStep="UpdatedValue"/>
        </Binding.ValidationRules>
    </Binding>
</DataGridTextColumn.Binding>

И

<DataGridTextColumn                                         
Header="Time, min" 
x:Name="uiDataGridTextColumnTime"
Width="Auto"                                            
CellStyle="{StaticResource ResourceKey=DataGridCellText}"     
Binding="{Binding fTime, StringFormat={}\{0:0.00\}, ValidatesOnDataErrors=True}" 
IsReadOnly="False">

Проверка: CellDataInfoValidationRule - это пользовательский класс, и получите его здесь

public class CellDataInfoValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        // obtain the bound business object
        BindingExpression expression = value as BindingExpression;
        IDataErrorInfo info = expression.DataItem as IDataErrorInfo;

        // determine the binding path
        string boundProperty = expression.ParentBinding.Path.Path;

        // obtain any errors relating to this bound property
        string error = info[boundProperty];
        if (!string.IsNullOrEmpty(error))
        {
            return new ValidationResult(false, error);
        }

        return ValidationResult.ValidResult;
    }
}

И ваш объект данных должен реализовывать IDataErrorInfo

0 голосов
/ 15 мая 2012

Мой обходной путь - просто удалить свойство UpdateSourceTrigger = "LostFocus" из объявления привязки в каждой колонке данных.

0 голосов
/ 12 декабря 2011

Мой сценарий был таким:

  1. Модель реализует IDataErrorInfo
  2. Правило пользовательской проверки строки на основе Практическая таблица WPF DataGridПримеры -Валидация с IDataErrorInfo , которая объединила все ошибки из Модели с использованием IDataErrorInfo.

    <DataGrid.RowValidationRules>
        <local:RowDataInfoValidationRule ValidationStep="UpdatedValue" />
    </DataGrid.RowValidationRules>
    
  3. ValidatesOnDataErrors=True, ValidatesOnExceptions=True, NotifyOnValidationError=True в привязке (которую яначалось с)

Это вызвало множественный доступ к моему модулю проверки и в конечном итоге оставил мой DataGrid в несогласованном состоянии (уведомление об ошибке в заголовке строки, даже когда строка действительна).

Решение состояло в том, чтобы удалить переключатели из привязки (пункт 3).

Я предлагаю прочитать до Устранение ошибки проверки строки DataGrid тоже.

...