Главная » Silverlight » Редактирование решетки DataGrid

0

Одно из наиболее существенных преимуществ класса DataGrid — поддержка редак­тирования содержимого решетки. Ячейка DataGrid переключается в режим редактиро­вания, когда пользователь дважды щелкает на ней. Класс DataGrid предоставляет ряд возможностей ограничить редактирование.

•       DataGrid. IsReadOnly. Когда это свойство равно True, пользователь не может ре­дактировать содержимое решетки.

•       DataGridColumn. IsReadOnly. Когда это свойство равно True, пользователь не мо­жет редактировать содержимое столбца.

•       Режим "только чтение". Если у объекта данных есть свойство, но нет проце­дуры его установки, DataGrid замечает этот факт и запрещает редактирование столбца так, будто свойство DataGridColumn. IsReadOnly имеет значение True. Аналогично, если свойство имеет тип, отличный от текстового, числового или даты, DataGrid автоматически делает его доступным только для чтения. Сделать его доступным для редактирования можно с помощью класса DataGridTemplate- Column, как описано далее.

Что происходит, когда ячейка переключается в режим редактирования, зависит от типа столбца. Столбец DataGridTextColumn выводит текстовое поле с невидимой рамкой, заполняющее всю ячейку. Столбец DataGridCheckBox выводит флажок, который можно установить или снять. Столбец DataGridTemplateColumn позволяет заменить стандарт­ное текстовое поле специальным элементом ввода, например, DatePicker или ComboBox.

Редактирование с помощью шаблона

Объект DataGridTemplateColumn поддерживает два типа шаблонов. Шаблон CellTemplate определяет внешний вид ячейки, когда она не редактируется. Шаблон CellEditingTemplate с помощью выражения двустороннего связывания, подключаю­щего ячейку к соответствующему полю, задает элемент управления, выводимый в ре­жиме редактирования. В обоих шаблонах можно использовать одни и те же элементы управления.

Ниже приведена разметка столбца, выводящего даты. Когда пользователь дважды щелкает на ячейке, чтобы отредактировать ее значение, на экране появляется элемент DatePicker (рис. 17.13) с текущим выделенным значением.

<data:DataGridTemplateColumn Header="Date Added"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> CTextBlock Margin="4" Text= "(Binding DateAdded, (fonverter={StaticResource DateOnlyConverter}}"></TextBlock>

</DataTemplate> </data: DataGridTemplateColumn. CellTemplate> <data:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <controls:DatePicker

SelectedDate="{Binding DateAdded, Mode=TwoWay}"> </controls:DatePicker> </DataTemplate> </data:DataGridTemplateColumn.CellEditingTemplate> </data:DataGridTemplateColumn>

Рис. 17.13. Редактирование дат с помощью элемента DatePicker

Шаблон можно применить для предоставления подстановочного списка вари­антов. Например, можно ограничить столбец Category списком предопределен­ных категорий. Легче всего это сделать, создав раскрывающийся список в шаблоне

CellEditingTemplate. Затем свяжите ComboBox.Selectedltem с Product.CategoryName методом двустороннего связывания. Свяжите также свойство ComboBox. ItemsSource с коллекцией, содержащей разрешенные значения. В следующем примере эта коллекция предоставлена свойством Product.CategoryChoices.

<data:DataGridTemplateColumn Header="Category"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Margin="4" Text="{Binding CategoryName} </TextBlock> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate>

<data:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <ComboBox Margin="4"

ItemsSource="{Binding CategoryChoices)" Selectedltem="{Binding CategoryName, Mode=TwoWay}"> </ComboBox> </DataTemplate> </data:DataGridTemplateColumn.CellEditingTemplate> </data:DataGridTemplateColumn>

События проверки и редактирования

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

Рис. 17.14. Исключение произошло при установке свойства

Класс DataGridTextColumn автоматически применяет выражение связывания, под­держивающее проверку. Однако при использовании DataGridTemplateColumn нужно явно добавить свойства ValidatesOnExceptions и NotifyOnValidationError в выраже­ние связывания в CellEditingTemplate.

<data:DataGridTemplateColumn Header="Price"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Margin="4" Text="{Binding UnitCost,

Converter={StaticResource PriceConverter}}"> </TextBlock> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> <data:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Margin="4"

Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"> </TextBox> </DataTemplate> </data:DataGridTemplateColumn.CellEditingTemplate> </data:DataGridTemplateColumn>

Реализовать проверку в DataGrid можно и другими способами. Один из вари­антов состоит в применении событий редактирования, приведенных в табл. 17.4. Последовательность событий, генерируемых объектом DataGrid, совпадает с последо­вательностью строк.

Таблица 17.4. События редактирования DataGrid

Событие

Описание

BeginningEdit

Генерируется перед переключением ячейки в режим редактирования; в этот момент можно проанализировать столбец и строку, проверить значение ячейки, отменить операцию с помощью свойства

DataGrldBeginningEditEventArgs. Cancel и т.д.

PreparingCellForEdit

Используется в шаблонах столбцов; позволяет инициализировать редактируемые элементы управления; значение DataGridPreparingCellForEditEventArgs. EditingElement используется для обращения к элементу шаблона

CellEditingTemplate

CellEditEnding

Генерируется перед выходом ячейки из режима редактирования; Объект DataGridCellEndingEventArgs.EditAction сообщает, попытался ли пользователь зафиксировать результаты редактирования (например, нажав клавишу <Enter> или щелкнув в другой ячейке) или отменил результаты, нажав клавишу <Esc>; можете проверить введенные данные и установить свойство Cancel, чтобы отменить изменения

CellEditEnded

Генерируется после возвращения ячейки в нормальное состояние; используется для обновления других элементов управления или вывода сообщения об изменениях

RowEditEnding

Генерируется, когда пользователь переходит к другой строке после редактирования текущей; используется для проверки или отмены изменений; в проверку могут быть вовлечены несколько столбцов, например, чтобы убедиться в том, что значение в одном столбце превышает значение в другом

RowEditEnded

Генерируется после перехода к другой строке после редактирования текущей; используется для обновления других элементов управления или вывода сообщения об изменениях

Чтобы разместить логику проверки, специфичную для страницы (по этой причине ее нельзя вставить в объекты данных), создайте пользовательскую процедуру, реаги­рующую на события CellEditEnding и RowEditEnding. Код проверки столбца помести­те в обработчик события CellEditEnding, а код проверки всей строки — в обработчик RowEditEnding. Не забывайте, что при отмене результатов редактирования пользовате­лю нужно предоставить объяснение проблемы. Обычно его выводят в текстовом бло­ке в другом месте страницы, в дочернем окне ChildWindow или во всплывающем окне сообщений.

Важно отметить, что DataGrid поддерживает аннотирование данных не так, как обычные элементы ввода. Если процедура установки свойства использует ме­тод Validator.ValidateProperty() для проверки значений и генерации исключения ValidationException (см. выше), элемент DataGrid реагирует, как обычно: обнаружи­вает ошибку и выводит красное облако сообщения. Однако если класс Validator не ис­пользуется, элемент DataGrid сам проверяет свойства и весь объект. Разница в том, что DataGrid не выполняет проверку, пока пользователь не попытается перейти к следую­щей строке. Если в этот момент элемент DataGrid обнаружит ошибку, он обработает ее иначе: вернет пользователя в неправильную строку, переключит строку обратно в режим редактирования и выведет внизу сообщение об ошибке. В примере, показанном на рис. 17.15, введенные данные нарушили правила проверки, заданные в пользова­тельской процедуре класса ProductValidation.

Рис. 17.15. Нарушение аннотирования данных

К проблеме можно подойти иначе. Любое исключение, генерируемое в процедуре уста­новки свойства, обрабатывается при возникновении события CellEditEnding. Правила аннотирования данных, которые вы установили в разметке, но не подключили явно в коде, применяются элементом DataGrid при возникновении события RowEditEnding.

Можете воспользоваться этим. Если нужно редактировать и обычные элементы управления, и решетку DataGrid, примените метод Validator. ValidateProperty О для защиты от неправильных данных. Однако если для редактирования используется только DataGrid, имеет смысл отказаться от кодов установки свойств и предоставить обнаружение ошибок решетке DataGrid. Не забывайте только, что тогда при программ­ной установке значений правила аннотирования не сработают. Учитывайте также, что это может привести к странной ситуации: если решетка DataGrid загружена с непра­вильными данными и пользователь попытается отредактировать эти данные, ячейка будет заблокирована в режиме редактирования, пока пользователь не введет правиль­ные данные. Он не сможет отменить результат редактирования, потому что исходное значение неправильное.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии