Проверка IDataErrorInfo в DataGrid с помощью CellTemplate и CellEditingTemplate

У меня проблемы с проверкой в ​​DataGrid. Я использую проверку IDataErrorInfo в модельных классах.

Проблема в редактируемом DataGrid с отдельными CellTemplate и CellEditingTemplate (Примечание - это свойство, отличное от NULL - проверка возвращает Error, если NULL или пусто):

<!-- some other validated columns -->
<DataGridTemplateColumn Header="Note">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>                                    
            <TextBox Name="textBoxNote" Text="{Binding Note, ValidatesOnDataErrors=True}" />                                    
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Note}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

На кнопке "Сохранить" я проверяю свойство проверки MyObject.Error и, если оно не равно NULL, я показываю MessageBox. Проблема заключается в том, что при изменении первого столбца (не Note) на допустимое значение и нажатии кнопки Сохранить свойство.Error имеет значение null - это ожидаемое (хотя и нежелательное) поведение, поскольку привязка с помощью свойства ValidatesOnDataError on Note никогда не выполнялась (Элемент управления TextBox никогда не существовал!). Но если я установлю для ValidatesOnDataErrors значение true в TextBlock, то получу нежелательную проверку для каждого объекта, показанного в DataGrid (скажем, из базы данных), который меня не беспокоит; проверка может также занять много времени в этом случае...

Как правильно решить эту проблему? Я хотел бы сохранить проверку в модельных классах (объект должен знать, действителен ли он или нет). Есть ли способ принудительно проверить привязанный к строке объект в codebehind (событие кнопки Save)? Или я должен как-то инициализировать.Error при построении объекта? Есть другие идеи?

РЕДАКТИРОВАТЬ: как я могу перевести всю строку (все ячейки) в режим редактирования (CellEditingTemplate)? Затем все элементы управления будут загружены и привязаны к данным, это также означает, что проверено...

Спасибо всем, БД

1 ответ

Решение

Хорошо, мне удалось повторно проверить объект IDataErrorInfo - вид принудительной проверки IDataErrorInfo. В противном случае я мог бы добавить новый объект в DataGrid, но свойства (кроме отредактированных) никогда не проверялись.

В суперкласс всех объектов моей модели (который расширяет IDataErrorInfo) я добавил этот метод:

public virtual void Revalidate() // never needed to override though
{
    Type type = this.GetType();

    // "touch" all of the properties of the object - this calls the indexer that checks
    // if property is valid and sets the object's Error property 
    foreach (PropertyInfo propertyInfo in type.GetProperties())
    {                
        var indexerProperty = this[propertyInfo.Name];
    }
}

Теперь, когда пользователь добавляет новый объект в DataGrid, я вручную вызываю метод myNewObject.Revalidate(), чтобы установить свойство Error, которое я проверяю перед сохранением объекта в базе данных. Возможно, это не самое лучшее решение, но оно работает для меня очень безболезненно.

Спасибо и всего наилучшего, БД

Другие вопросы по тегам