Установить весь выбранный шаблон строки 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, которое я проверяю перед сохранением объекта в базе данных.
Спасибо и всего наилучшего, БД