5. Общее представление об интерфейсах привязки данных

Привязка данных в приложениях WinFx

winfx является преемником платформы разработки

Windows Presentation Foundation, известная ранее под условным наименованием «Avalon», является подсистемой представления платформы разработки WinFx для Windows Vista, Windows ХР и Windows Server 2003. WinFx является преемником платформы разработки Win32 и опирается на. NET Framework. В состав WinFx входит также Windows Communication Foundation. Возможности представления WinFx должны произвести революционный переворот в разработке развитых пользовательских интерфейсов как для рабочего стола, так и для браузера. Машина отображения WinFx ориентирована на лучшее использование мощности современных графических плат и дисплеев. Появление WinFx не делает программирование или приложения Windows Forms устаревшими. Приложения Windows Forms будут продолжать прекрасно работать на существующих платформах Windows, как и на Windows Vista. WinFx является сегодня наилучшей основой для разработки приложений рабочего стола и будет оставаться таковой для портативных приложений до тех пор, пока вы не откажетесь от поддержки клиентов Windows 2000. Однако WinFx предлагает много новых возможностей, которыми вы, возможно, захотите воспользоваться прямо сейчас, особенно если вы пишете приложения с развитой графикой или вам требуется иметь полный контроль над настройками пользовательского интерфейса своих приложений. В будущем о программировании WinFx будет написано много книг и статей, и вам нужно будет глубоко в них разобраться, чтобы стать настоящим программистом WinFx. Очень хорошая книга — «Programming Windows Presentation Foundation» Криса Селлса и Йена Гриффита. В этом приложении я хочу дать краткое введение в разработку пользовательских интерфейсов WinFx, чтобы вы получили представление о том, как там работает привязка к данным в сравнении с Windows Forms. Во время написания этой книги я пользовался WinFx SDK Beta 1 с Visual Studio 2005 Beta 2. Если вы собираетесь работать с подобными бета-версиями инструментов, я настоятельно рекомендую использовать виртуальную машину, такую, как Microsoft Virtual PC или VMware Workstation. Чтобы запускать образцы программ к этому приложению, вам нужно будет сначала установить WinFx Beta 1 Runtime Components, затем WinFx SDK Beta 1, затем Visual Studio 2005 Beta 2 и, наконец, Visual Studio 2005 Extensions для WinFx SDK Beta 1.

Классы ScrollableControl и Contai — nerControl

класс scrollablecontrol предусматривает поддержку для

После Control в иерархии следуют классы ScrollableControl и Contai — nerControl, чьи имена достаточно объясняют их особенности. Класс ScrollableControl предусматривает поддержку для элементов управления, содержание которых больше той области, в которую они будут отображаться, предлагая производным классам возможность прокрутки содержания в пределах ограниченной области экрана без написания массы специального кода рисования, который это обеспечивает. Класс ContainerControl предусматривает поддержку для хранения коллекции дочерних элементов управления и гарантирует вызов всех этих дочерних элементов для своего отображения всякий раз, когда перерисовывается родительский элемент управления. Наконец, имеется класс Form, который часто будет непосредственным базовым классом для любых форм, которые вы создаете с своих приложениях Windows. Класс Form предусматривает отображение по умолчанию, которое включает строку заголовка, обрамление и фоновую поверхность в стиле диалога, на которую вы можете добавлять дочерние элементы управления. Класс Form запрограммирован с большой гибкостью, позволяющей вам настраивать практически любой аспект представления. Сиблингом класса Form является класс с именем UserControl. Это класс, от которого целесообразно производить специальные элементы управления, когда вы хотите, чтобы они имели рабочую поверхность по умолчанию и имели встроенную поддержку для дочерних элементов управления. Распространенный пример — элемент управления для авторизации, который содержал бы поля для ввода имени пользователя и пароля, которые должны появляться на различных формах вашего приложения. Вы, вероятно, захотели бы, чтобы эти элементы управления имели одну и ту же планировку и внешний вид всякий раз, когда они отображаются, но не хотели бы повторять в различных формах один и тот же код для их объявления и использования.

Элементы управления с единственным значением таких как Text Box

можно также явно вызывать методы

Для элементов управления с единственным значением, таких, как TextBox, Для установки свойства Text Используют обычно выражения привязки данных или устанавливают значение программно из методов кода поддержки. Можно также явно вызывать методы или свойства кода поддержки в выражении привязки данных, если они являются защищенными или открытыми элементами класса кода поддержки. Например, чтобы установить свойство Text Элемента TextBox На странице, используя свойство из кода поддержки с именем CurrentCustomersID, Можно было бы написать в ASPX-странице такой код: Заметьте, что все обсуждавшееся до сих пор относилось к отображению данных, связанных с элементом управления, что является односторонней привязкой к данным. Что же можно сказать о получении обновлений от привязанных элементов управления, если пользователь редактирует данные? А то, что именно здесь вы сталкиваетесь с ограничениями, накладываемыми моделью Web запрос-ответ. У сервера нет никаких способов знать, утвердит ли вообще пользователь эти изменения, и не имеет смысла держать в памяти сервера экземпляры элементов управления, связывая тем самым ресурсы. Поэтому всякий раз, когда страница отображается, эта страница и все ее дочерние элементы управления создаются, используются и уничтожаются. Если пользователь делает в браузере изменения в отображаемых данных при посредстве элементов управления и отсылает их обратно, это выражается в форме нового запроса, обычно отсылки к той же странице в приложении ASP. NET. Изменившиеся данные вернутся как параметры отправления формы для входных элементов управления страницы, и страница должна будет заново ассоциировать полученные значения с новыми экземплярами элементов управления, которые она создает в процессе обработки отсылки. Тем самым, с программной точки зрения, создается видимость, что вы работаете с тем же экземпляром элемента управления, что и при начальном отображении страницы, хотя в действительности это не так. В результате трудно достигнуть впечатления истинной двусторонней привязки к данным, поскольку для этого требуются долгоживущие экземпляры элементов управления, существующие в течение всего взаимодействия с пользователем, также как и питающие их источники данных.

Интерфейсы участвующие в привязке данных

эти коллекции могут быть специальными

Интерфейсы, участвующие в привязке данных, предназначены для заключения двустороннего контракта между привязанными к данным элементами управления и коллекциями объектов данных, используемыми этими элементами. Эти коллекции могут быть специальными рабочими коллекциями, содержащими рабочие объекты, или какими-то из типов коллекций и объектов. NET Framework, таких, как коллекция DataView, Содержащая объекты DataRowView. Благодаря использованию этих интерфейсов для определения коммуникаций между привязанными элементами управления и объектами данных, элементам управления не требуется знать о конкретных типах объектов, к которым они привязаны, а объектам данных не нужно ничего знать о специфических возможностях привязанных к ним элементов управления. Когда вы будете понимать, что представляют собой интерфейсы и для чего они предназначены, вся «магия» привязки данных окажется не более чем дымом и зеркалами, а говоря точнее, просто работой интерфейсов, вовсе не магических, но тем не менее очень мощных. Хотя материал этой главы может показаться вам слишком «грубой материей», для его чтения имеется ряд веских причин. Первая из них та, что для подлинного понимания происходящего в привязке данных и для поиска причин возникающих проблем необходимо понимать, что происходит «за кулисами». Привязка данных приводится в действие интерфейсами, обсуждаемыми в этой главе, и работой элементов управления и компонентов. NET Framework с объектами, реализующими эти интерфейсы. Вторая причина состоит в том, что если вы собираетесь использовать в привязке данных специальные коллекции объектов, то вам придется реализовать некоторые из этих интерфейсов, чтобы обеспечить саму возможность привязки коллекции и редактирования ее объектов через привязанные элементы управления. Наконец, если вы собираетесь реализовывать специальные элементы управления, поддерживающие привязку данных, или просто программно работаете с коллекцией в своем приложении, при реализации кода привязки к данным и программной логики вы будете выступать в качестве клиента этих интерфейсов.

Организация виртуального режима

создайте сетку и определите в

Ниже описывается последовательность действий для организации привязки данных в виртуальном режиме. Создайте сетку и определите в ней столбцы, которые будут работать в виртуальном режиме. Переведите сетку в виртуальный режим, установив ее свойство VirtualMode Равным True. Ели вы не применяете привязку данных, добавьте к сетке нужное число строк, чтобы обеспечить поддержку прокрутки. Самым простым и быстрым способом сделать это является создание единственной строки-прототипа, любое количество копий которой можно добавить затем к сетке методом AddCopies Коллекции Rows. В данный момент не нужно беспокоиться о содержимом ячеек, так как вы собираетесь предоставлять его динамически в обработчике события, в процессе отображения сетки. Последним шагом является подключение обработчика для события CellValueNeeded Сетки. Это событие возбуждается только в том случае, если сетка функционирует в виртуальном режиме, и будет запускаться для каждой видимой в настоящий момент ячейки несвязанного столбца либо при первом ее отображении, либо при прокрутке сетки показывает простое приложение Windows Forms, демонстрирующее использование виртуального режима. Объект DataGridView Был помещен на форму в конструкторе и назван M Grid; Также на форму была добавлена кнопка с именем M GetVisitedCountButton Для проверки того, сколько строк появлялось в сетке в результате прокрутки. Конструктор формы, как обычно, начинается с вызова InitializeCom — Ponent, Чтобы исполнить код, генерированный в результате операций перетаскивания и установок в окне Properties. В данном примере этот код просто объявляет и создает на форме сетку и кнопку. Затем код конструктора назначает посредством неявного делегирования два обработчика событий. Для виртуального режима важен первый из обработчиков — для события CellValueNeeded. Как уже упоминалось, это событие возбуждается только в виртуальном режиме сетки и запускается для каждой ячейки несвязанного столбца, видимой в сетке в любой данный момент. Когда пользователь прокручивает сетку, это событие вновь запускается для каждой из ячеек, появляющихся в процессе прокрутки. Конструктор также назначает обработчик для события щелчка на кнопке, который позволяет вам посмотреть, для скольких строк в действительности вызывался обработчик события CellValueNeeded