Установить весь выбранный шаблон строки DataGrid в CellEditingTemplate

У меня есть вопрос относительно WPF DataGrid. Ради проверки IDataErrorInfo я хотел бы установить всю выбранную строку как редактирование - под этим я подразумеваю установку шаблона данных каждой ячейки (в этой строке) из CellTemplate в CellEditingTemplate.

Это один столбец, например:

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

Это возможно в XAML (триггеры какого-то рода)? Как бы я сделал это в codebehind? Я нашел решение с двумя отдельными стилями в качестве ресурсов, а затем программно переключался между ними в событиях Row_Selected и Row_Unselected, но я бы предпочел использовать существующий выше код XAML для столбцов (с отдельными CellTemplate и CellEditingTemplate).

Кто-нибудь может указать мне правильный путь?

Заранее спасибо. С уважением, БД

1 ответ

Решение

Хорошо, мне не удалось перевести всю строку в режим редактирования, но мне удалось повторно проверить объект IDataErrorInfo - что-то вроде принудительной проверки IDataErrorInfo. По этой причине я захотел установить режим редактирования для всех ячеек строки - привязать элементы управления из CellEditingTemplate к свойствам объекта с ValidateOnDataErrors = True. В противном случае я добавил новый объект в 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, которое я проверяю перед сохранением объекта в базе данных.

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

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