Главная » Silverlight » Формы данных

0

В предыдущей главе вы узнали об использовании связывания данных для создания про­стых форм. Подобные формы — это обычные страницы, состоящие из текстовых полей и других связанных элементов управления и позволяющие вводить, редактировать и просма­тривать данные. Объем кода С#, необходимого для их создания, сравнительно небольшой.

Однако подобные формы не столь совершенны, как может показаться на первый взгляд. Для их создания нужно написать много разметки XAML, которая должна содер­жать многочисленные жестко закодированные параметры, такие как заголовки, пригла­шения и сообщения об ошибках. Управление всеми этими подробностями — непростая задача, особенно если модель данных часто изменяется. При любом изменении в базе данных нужно модифицировать все классы данных и пользовательского интерфей­са, причем компилятор Visual Studio не может обнаружить неправильное связывание и устаревшие процедуры проверки.

По этим причинам разработчики Silverlight немало потрудились над созданием высокоуровневых элементов управления данными, вспомогательных классов и даже серверной инфраструктуры управления данными (речь идет о разрабатываемых, но еще не представленных службах RIA). И хотя указанные инструменты пока что на­ходятся на стадии развития, некоторые из них уже проникли в Silverlight. В данном разделе вы узнаете о трех таких компонентах — классах Label, DescriptionViewer и ValidationSummary, — облегчающих создание мощных форм данных прямо сейчас, особенно в сочетании со средствами аннотирования данных.

Примечание. Чтобы получить доступ к элементам управления Label, DescriptionViewer и ValidationSummary, нужно добавить в проект ссылку на сборку System.Windows .Controls .Data. Input. dll. Если вы добавили в проект любой из этих элементов управления из пакета Toolbox, программа Visual Studio автоматически добавит ссылку на сборку и префикс пространства имен xmlns :datalnput="clr- namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input".

Разметка класса данных

Элементы Label, DescriptionViewer и ValidationSummary можно использовать без классов данных, но тогда не удастся реализовать все, на что они способны. В классах данных применяется набор атрибутов для внедрения дополнительной информации о дан­ных. Атрибуты позволяют перенести подробности, имеющие отношение к данным (такие, как описание свойств, правила проверки и т.д.), с разметки страницы в классы данных.

Структура на основе атрибутов предоставляет ряд преимуществ. Во-первых, она су­щественно экономит время, позволяя быстрее создавать формы данных. Во-вторых, что еще важнее, она облегчает сопровождение приложения, потому что при ее использо­вании легче синхронизировать параметры обработки данных. Если нижележащая мо­дель данных изменится, достаточно будет настроить атрибуты. Это намного быстрее и надежнее, чем отслеживать описательный текст и правила проверки, разбросанные по многим страницам, особенно если коды классов данных были скомпилированы в раз­ных проектах и, скорее всего, разными разработчиками.

В следующих разделах вы увидите, как работает эта система. Вы узнаете, как вне­дрить заголовки, описания и правила проверки непосредственно в объекты данных и передать классы данных посредством веб-служб без потери внедренной в них дополни­тельной информации.

Элемент Label

Элементы Label используются в рассматриваемой схеме вместо объектов TextBlock для вывода заголовков элементов управления данными. Рассмотрим разметку, которая с помощью объекта TextBlock выводит надпись Номер модели рядом с текстовым по­лем, содержащим значение.

<TextBlock Магдіп="7">Номер модели:</TextBlock>

CTextBox Margin="5" Grid.Column="l" x:Name="txtModelNumber" Text="{Binding ModelNumber, Mode=TwoWay)">C/TextBox>

Вместо текстовых блоков можно использовать элемент Label.

<datalnput:Label Margin="7" Contents"Номер модели:"> </dataInput:Label>

CTextBox Margin="5" Grid.Column="l" x:Name="txtModelNumber" Text="{Binding ModelNumber, Mode=TwoWay}"></TextBox>

Пока что элемент Label не предоставляет никаких преимуществ. Они появляют­ся при его связывании с элементом управления, для которого необходим заголовок. Связывание выполняется с помощью свойства Target.

<datalnput:Label Margin="7" Target=" {Binding ElementName=txtModelNuinber} "> </dataInput:Label>

<TextBox Margin="5" Grid.Column="l" x:Name="txtModelNumber" Text="{Binding ModelNumber, Mode=TwoWay)"></TextBox>

Теперь заголовок можно использовать иначе. Вам не нужно вводить в него фрагмент текста вручную, он сам анализирует элемент, находит связанное свойство и считывает приведенный ниже атрибут Display.

[Display(Name="HoMep модели")]

public string ModelNumber { … }

Прочитав атрибут, элемент Label выводит на экран заголовок Номер модели.

Примечание. Перед добавлением атрибута Display в класс данных, нужно добавить ссылку на сборку System. ComponentModel.DataAnnotations.dll. Необходимо также объявить пространство имен System. ComponentModel. DataAnnotations на странице, на которой определен атрибут Display.

Использование элемента Label не уменьшает объем разметки. Даже наоборот: на­писание выражения связывания, подключающего Label, — более трудоемкая операция, чем заполнение элемента TextBlock этим же текстом. Однако использование элемента Label предоставляет ряд преимуществ. Наиболее очевидное состоит в том, что разметку становится легче сопровождать. При изменении класса данных новый заголовок авто­матически появится в форме; вам не придется вручную искать и заменять его.

Элемент Label применяется не только для вывода заголовков. Часто с его помощью отображают значения свойств и сообщения об ошибках, обнаруженных во время про­верки данных. Чтобы отметить тот факт, что свойство обязательно должно быть предо­ставлено, добавьте атрибут Required.

[RequiredO] . [Display(Name="HoMep модели")]

public string ModelNumber

{ … }

По умолчанию элемент Label реагирует, делая шрифт заголовка полужирным. С по­мощью визуальных состояний Required и NotRequired шаблона можете изменить такое поведение или добавить анимационный эффект. Шаблоны и визуальные состояния эле­ментов управления рассматриваются в главе 13.

Элемент Label может реагировать на ошибки, возникающие при вводе данных пользователем. Для этого его нужно связать с системой проверки с помощью свойств ValidatesOnExceptions и NotifyOnVaqlidationError. Ниже показано связывание со свойством UnitCost.

<datalnput:Label Margin="7" Grid.Row="2" Target="{Binding ElementName=txtUnitCost}"> </dataInput:Label> <TextBox Margin="5" Grid.Row="2" Grid.Column="l" x:Name="txtUnitCost" Width="100"

HorizontalAlignment="Left" Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"></TextBox>

Введите нечисловой символ в текстовое поле UnitCost и удалите из него фокус. Текст заголовка превратится с черного в красный (рис. 17.1). Более интересных результатов можно достичь, изменив шаблон и визуальные состояния Valid и Invalid.

Рис. 17.3. Итоговый список содержит информацию о трех ошибках

Примечание. Не забывайте, что для перехвата ошибок элементом ValidationSummary свойство Mode должно иметь значение TwoWay, а свойства ValidatesOnExceptions и MotifyOnValidationError — значение True.

Когда ни одной ошибки нет, элемент ValidationSummady невидим. Он свернут и не занимает пространства. Когда есть одна или большее количество ошибок, он вы­водится на экран (см. рис. 17.3). Элемент состоит из заголовка, в котором приведено количество ошибок, и списка, содержащего имена свойств и сообщения, определенные в исключениях. При щелчке на сообщении в списке элемент ValidationSummary ге­нерирует событие FocusinglnvalidControl и передает фокус элементу ввода с непра­вильными данными (если свойству FocusControlOnClick явно не присвоено значение False).

Чтобы запретить элементу управления добавлять свои ошибки в ValidationSummary, нужно установить свойство ShowErrorsInSummary.

<TextBox Margin="5" x:Name="txtUnitCost" Width="100" Ногі zontalAlignment="Le ft"

datalnput:ValidationSummary.ShowErrorsInSummary= "False"

Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=true,

NotifyOnValidationError=true}"X/TextBox>

Элемент ValidationSummary предоставляет несколько свойств, которые можно ис­пользовать для настройки его внешнего вида. Свойство HeaderTemplate содержит шаблон данных, позволяющих изменить представление заголовка, свойство Header позволяет задать текст заголовка, а свойство SummaryListBoxStyle определяет стиль форматирования списка. Свойство HasErrors можно проверить программно, чтобы вы­яснить, есть ли в форме ошибки. Если есть, то их можно извлечь из коллекции Errors и программно обработать.

Элементы управления DataField и DataForm

Пакет Silverlight Toolkit содержит два инструмента, полезных при создании мощных форм данных. Элемент управления DataField предоставляет впечатляющий набор средств редактирования одного связанного свойства, а в элемен­те DataForm объединены средства многих элементов, таких как Label, DescriptionViewer, TextBox и др. Более мощный — элемент DataForm. Это контейнер, создающий все связанные элементы управления, необхо­димые для вывода и редактирования объектов данных. Вывести один объект данных можно с помощью свойства Currentltem.

dataForm.Currentltem = product;

Для вывода коллекции элементов используется свойство ItemsSource. dataForm.ItemsSource = products;

В любом случае элемент DataForm создает для каждого свойства объекта данных элементы ввода с заголовками и объектами DescriptionViewer. Если с помощью ItemsSource связать много элементов, DataForm даже добавит строку навигации в верхнюю часть формы. С ее помощью пользователь может проходить по записям, до­бавлять новые записи, удалять существующие и т.д. Кроме того, элемент DataForm предоставляет ряд свойств для настройки своего внешнего вида и добавления пользовательских шаблонов, позволяющих разместить в контейнере дополнительные элементы управления. Однако для лучшей управляемости многие разработчики предпочитают созда­вать собственные формы данных, вводя разметку вручную. Видимо, ситуация изменится, когда элемент DataForm станет более зрелым и будет включен в пакет Silverlight SDK.

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

По теме:

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