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

Контексты данных и источники данных

b этот интерфейс необходим для

Класс CustomersCollection Из листинга Б.2 является производным от класса 0BservableCollection<T>, В котором предусмотрена реализация интерфейса INotifyCollectionChanged. Этот интерфейс необходим для синхронизации нескольких элементов управления, привязанных к коллекции, и по своим функциям похож на событие ListChanged Интерфейса IBindingList. Поскольку интерфейс INotifyCollectionChanged Появился только в WinFx, существующие классы коллекций и наборов данных. NET Framework не поддерживают в полной мере возможности привязки данных для элементов управления WinFx. Для привязки данных можно использовать любую коллекцию, которая поддерживает по меньшей мере интерфейс LEnumerable, Позволяющий коду привязки в WinFx выполнять итерацию по объектам коллекции и представлять извлекаемые из них значения при помощи объектов Bind. Можно также использовать отдельные объекты, если контекст данных будет осуществлять привязку только элементов управления с единственным значением. Источник данных устанавливается через свойство DataContext Любого элемента на уровне приложения, окна или любого дочернего элемента управления. Повторим, что когда происходит привязка данных, любые привязанные элементы управления используют для своей привязки контекст данных ближайшего родителя, у которого он установлен. Свойство DataContext Объявляется в классе FrameworkElement И имеет тип System.Object, Что позволяет устанавливать его на любой объект. Для привязки данных с более мощными функциями, такими, как возможность редактирования данных в привязанных объектах, обнаружения изменений в коллекции, когда они производятся другим элементом управления или программным кодом, или возможность сортировать и фильтровать коллекцию данных, вам потребуются объекты и коллекция данных, которые поддерживают целый ряд интерфейсов, подобных тем, что обсуждались в главе 7. Вполне возможно, что ко времени выпуска WinFx эти интерфейсы сильно изменятся, поэтому я не буду здесь вдаваться в обсуждение их деталей. Наиболее мощной коллекцией для размещения ваших объектов на сегодняшний день является класс ObservableCollection<T>, Входящий в пространство имен System.Windows.Data. Будем надеяться, что к моменту появления WinFx на рынке классы DataView И другие обобщенные классы коллекций будут поддерживать необходимые интерфейсы, позволяющие использовать широкие возможности привязки данных в WinFx.

Основы обработки страниц в ASP. NET

net основана на модели обратных

Обработка Web-форм в ASP. NET основана на модели обратных отсылок. Когда страница посещается пользователем в первый раз, ASP. NET отображает страницу. Это включает в себя создание экземпляра класса страницы, запуск некоторых событий, входящих в процесс обработки, и команды каждому из элементов управления на странице отобразить себя в потоке откликов в форме кода HTML, который браузер сможет затем отобразить на рабочем столе пользователя. Если страница разработана как интерактивная, то модель обработки ASP. NET предполагает обратные отсылки со страницы. Это означает, что пользователь предпринимает какое-то действие, такое, как нажатие кнопки или выбор элемента управления, а это приводит к тому, что от браузера к Web-приложению ASP. NET посылается новый запрос для той же страницы. Этот новый запрос является POST-запросом HTTP к той же странице и может передавать любое число параметров от встроенных в страницу элементов управления. Код обработки страницы и сами элементы управления могут затем по-разному отображать содержание страницы в зависимости от отосланных параметров.

Как правило, страницы ASP. NET, построенные в Visual Studio, состоят из собственно страницы, т. е. ASPX-файла, содержащего разметку, описывающую страницу и ее содержание, и класса кода поддержки, который определяется в отдельном исходном файле и компилируется на этапе разработки в сборку, загружаемую ASP. NET во время исполнения. Код разметки в ASPX-файле компилируется в класс совместно с кодом из класса поддержки, который является либо определением неполного класса, соединяемым с определением ASPX-файла, либо класс страницы может быть производным от класса кода поддержки, который, в свою очередь, является производным от базового класса ASP. NET Раде. Код, управляющий обработкой отсылок и событий, обычно располагается в классе кода поддержки, хотя ASP. NET допускает также размещение всего кода поддержки в блоках сценариев в самом ASPX-файле. Последний может также содержать встроенные блоки сценариев различных типов для генерации содержания, которое будет выдаваться в виде HTML.

Построение привязанного к данным элемента управления для помощи в принятии решений

можно назвать это поддержкой принятия

Сценарий для этого примера предполагает, что вам нужно построить привязанный к данным элемент управления, отображающий данные в столбчатых диаграммах для целей сравнения, чтобы помочь кому-то принимать решения, исходя из этих данных. Можно назвать это поддержкой принятия решений, менеджментом знаний, бизнес-анализом или каким-то другим вашим любимым словом для такого рода функций. Очевидно, создание пригодного для серийных продуктов графического элемента управления, которым будут пользоваться ответственные служащие, принимающие решения ценою в миллиард долларов, потребует несколько большего объема кода, чем я мог бы «по условиям места и времени» поместить в этой главе. Поэтому я собираюсь ограничить функции и графическое представление довольно грубыми столбчатыми диаграммами, которые можно динамически генерировать из данных, имеющих соответствующую форму. Пример должен поддерживать пользователей, которые будут предоставлять элементу управления наборы данных. Наборы данных содержат ряды численных значений, представляющих различные категории, которые я хочу сравнивать по двум осям. Каждая строка данных является представлением некоторой данности, или логической единицы; в каждой строке будут наборы численных полей, каждое из которых представляет некоторую категорию данных, наличную во всякой логической единице, представляемой строкой. Если отобразить каждую строку в виде ряда графических столбиков, принимающий решения сможет быстро просмотреть сложную совокупность численных данных, отыскивая в них тенденции и признаки. Рассмотрим, например, набор данных, в котором каждая строка представляет годовой торговый оборот, а внутри этой строки имеются поля данных, содержащие суммы чистой прибыли по регионам, входящим в сферу интересов вашей организации. Если бы у вас был такого рода сценарий и вы хотели предоставить эти данные ответственным работникам для быстрого просмотра, в целях сравнения по годам и регионам, можно было бы представить их так, как показано на рис. 8.9.

Объект Binding

чтобы передавать данные в привязанные

Объект Binding Является посредником между источником данных и привязанным элементом управления. Чтобы передавать данные в привязанные элементы управления и принимать от них изменения, он адаптирует свое поведение в зависимости от Объект Binding Определяет, какое значение устанавливается в свойстве элемента управления, когда последний отображается или когда происходит изменение нижележащих данных. Также он определяет, какое значение записывается назад в элемент данных, когда происходит обновление, если источник данных обновление поддерживает. Объект Binding В. NET 2.0 был существенно усовершенствован, в частности, у него стало больше встроенных возможностей для автоматического форматирования данных при привязке. Привязка данных происходит в момент, когда объект Binding Включается в коллекцию DataBindings Элемента управления. Имеется несколько важных перегрузок конструктора объектов Binding, От которых существенно зависит то, что происходит при привязке данных. Параметры для различных перегруженных конструкторов приведены Каждый из этих параметров экспонируется также в качестве свойства класса Binding С тем же именем, только в записи согласно конвенции языка Pascal, что позволяет задавать эти значения декларативно, посредством свойств, вместо передачи их в параметрах конструктора. Ссылка на объект, реализующий интерфейс IFormatProvider. Этот обработчик формата передается преобразователям типов, используемым для форматирования и анализа значений, если преобразователями типов эти функции поддерживаются.Минимальный конструктор использует первые три параметра из перечисленных в. Перегрузки позволяют задать дополнительные параметры, необходимые для вашего сценария привязки данных. Когда вы разрешаете форматирование, передавая конструктору True В параметре FormattingEnabled Или задавая значение True Для свойства FormattingEnabled, Объект автоматически выполняет преобразования типов между типом свойства, принадлежащего элементу управления, и типом компонента данных, когда выполняется форматирование, и наоборот, когда выполняется анализ. Если автоматическое форматирование выполнить не удалось, выбрасывается исключение FormatException. Автоматическое форматирование является альтернативой для ручной обработки событий Format И Parse. Значение по умолчанию для FormattingEnabled Равно False, Но, как правило, вам следует установить его равным True, Если только вы не стремитесь избежать любых изменений в источнике данных.

Привязка коллекции к сетке с помощью шаблонов

так как программисты использующие ваш

Можно было бы ожидать, что существует способ привязки коллекции объектов Customer К элементу управления сетки или таблицы, позволяющий получить табличное представление данных, подобно тому, как это можно сегодня сделать при помощи элементов управления DataGridView Или DataGrid. К сожалению, в наборе элементов управления WinFx еще нет развитого табличного элемента управления с привязкой к данным, поэтому приходится проделать немалую работу, чтобы генерировать UI, содержащий привязанную к данным сетку элементов управления, которая имитирует поведение DataGridView.

Один из возможных подходов состоит в том, чтобы программно перебирать коллекцию данных и динамически добавлять к сетке дочерние элементы управления. Но такой способ может оказаться неаккуратным, утомительным и слишком уязвимым для ошибок. Более изящным, хотя и менее очевидным подходом является использование шаблонов элементов WinFx. При помощи шаблонов элементов вы можете определить шаблон для содержания других элементов управления, и это содержание может быть сколь угодно сложным и содержать другие элементы. Например, чтобы в качестве отклика на привязку данных создать на ходу сетку текстовых полей, вы могли бы воспользоваться кодом XAML, показанным на листинге Б. З. Вместо объекта Window Этот пример определяет Раде Как часть приложения NavigationApplication. В NavigationApplication Автоматически создается окно NavigationWindow, И объект Раде, Специфицированный для свойства StartupUri Элемента NavigationApplication, Загружается в это окно в качестве начальной страницы. В результате вы получаете навигационные возможности браузера, но в развитой среде приложения В листинге Б. З под ItemsControl Определяется шаблон ItemTemplate. Этот ItemsControl Привязан к контексту данных по умолчанию, который устанавливается в коде поддержки при загрузке страницы, как показано чуть ниже. Происходит следующее. Для каждого элемента в привязанной коллекции в элемент ItemsControl Вводится экземпляр содержания ItemTemplate. Тем самым создается экземпляр сетки Grid, А каждый из содержащихся в ней элементов управления привязывается к соответствующей части текущего элемента, отображаемого для каждой строки в источнике данных.