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

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

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


person dabor    schedule 25.09.2012    source источник


Ответы (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, которое я проверяю перед сохранением объекта в базе данных.

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

person dabor    schedule 17.10.2012