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

Свойство Name

его можно использовать для целей

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

Свойство Converter Возвращает ссылку на объект TypeConverter Для типа свойства, если таковой имеется. Как говорилось в главе 4, класс Binding Использует конвертеры для автоматического форматирования значений привязанных данных в соответствующие типы. Другие сложные элементы управления, такие, как DataGridView, Могут применять конвертеры типов для внутренних операций того же рода при отображении значений компонентов в источнике данных. Кроме того, вы можете использовать PropertyDescriptor Для доступа к значению свойства для экземпляров ваших объектов данных. Его метод Get Value Принимает объектную ссылку на элемент данных, для которого вы хотите получить значение свойства, описываемого дескриптором. Он возвращает объектную ссылку, которая содержит значение этого свойства в экземпляре объекта данных, который вы передали. См. далее в этой главе листинг 7.1, где имеется пример вызова GetValue Для получения значений свойств элемента данных. Метод SetValue Работает сходным образом, позволяя установить значение конкретного свойства объекта, не имея никакой информации об объекте во время компиляции. Дескрипторы свойств поддерживают также выдачу уведомлений об изменениях в значениях свойств, если эти изменения делаются через метод SetValue, Экспонируемый дескриптором свойства. Когда привязанные элементы управления допускают редактирование пользователем привязанного к ним элемента данных, они используют метод SetValue Дескрипторов свойств этого элемента, не будучи привязаны к конкретному типу объекта. Если нужно уведомлять о таких изменениях значений свойств какой-то другой код, вы можете воспользоваться методом AddValueChanged, Чтобы передать возвратно-вызываемый объект и метод. Он будет вызываться всякий раз при изменении значения свойства методом SetValue Дескриптора свойства. Компонент BindingSource Использует эту возможность для получения уведомлений при всяком изменении свойства в одном из объектов данных в коллекции, которую он содержит. После этого он возбуждает событие ListChanged Своей реализации IBindingList, Что позволяет ему удерживать в синхронизированном состоянии несколько элементов управления, привязанных к одному и тому же источнику данных, когда значения данных редактируются через эти элементы управления.

Метод обработчика On Load Data

в этом примере вы можете

Метод обработчика OnLoadData Имеет сигнатуру, определяемую делегатом EventHandler, Который используется многими событиями элементов управления Windows Forms. В этом примере вы можете игнорировать передаваемые методу аргументы, но метод все равно должен объявлять эти аргументы, чтобы соответствовать определению типа делегата события.

Для обработчика события вы можете использовать любое имя, какое захотите, но я предлагаю вам следовать единообразному и легко читаемому соглашению об именах для ваших обработчиков событий. Я обычно даю им имена вида Оп<действие>, Как в этом примере. Вы часто будете создавать эти обработчики при помощи конструктора, а он, как вы увидите в следующем разделе, применяет несколько иное соглашение об именах, поэтому я, чтобы получить нужные мне имена методов, обычно устанавливаю имена своих обработчиков событий при помощи окна Properties. Код в обработчике события создает объект набора данных и загружает в него некоторые данные, используя метод ReadXml, Как показано в приложении Г. Исходный файл XML может быть любым допустимым кодом XML, подходящим для загрузки в набор данных, в котором имеется хотя бы одна таблица данных. В настоящем случае используется та же самая упрощенная версия XML для набора данных Customers, что показана в разделе «Загрузка наборов данных из файла» приложения Г. Как только набор данных заполнен, вы привязываете к сетке первую таблицу в наборе данных, используя свойство DataSource Сетки. В основных главах этой книги механика процесса привязки данных рассмотрена более подробно, но для целей настоящего приложения достаточно сказать, что когда вы устанавливаете свойство Datasource Сетки на таблицу данных, сетка извлекает информацию о схеме и создает столбец для каждого столбца в таблице, после чего перебирает строки в таблице, добавляя для каждой соответствующую строку, содержащую данные. Чтобы этот пример заработал, поместите XML-файл в тот же каталог, что и файл DataAppForm. cs, и компилируйте последний в командной строке, как уже было описано. Затем запустите получившийся файл Data — AppForm. exe и нажмите кнопку Load, и вот вы имеете ваше первое работающее приложение Windows Forms, привязанное к данным.

Элемент управления Xml Data Source

это особенно действенно в случае

Элемент управления XmlDataSource Позволяет производить привязку к данным в иерархическом документе данных XML. Это особенно действенно в случае элементов управления, способных представлять иерархические данные, таких, как TreeView И Menu, Но XmlDataSource Может также применяться, когда данные XML представляют собой табличные данные, получаемые в виде документа XML. Элемент управления SiteMapDataSource Является специализированным провайдером иерархических данных. Главным образом он применяется для отображения навигационных элементов управления на карту сайта, которая определяет структуру вашего сайта. Карта сайта определяется специальной схемой узлов в файле XML. Из-за ограниченного характера сценария, для которого предназначен этот управляющий элемент, он, в отличие от других элементов источников данных, не поддерживает сортировку, фильтрацию, пагинацию, кэширование и обновление. Чтобы включить в код разметки выражение, оцениваемое во время привязки к данным, мы помещали его в конструкцию <%# … %>. Код, размещаемый в этих выражениях привязки данных, может быть кодом, оцениваемым непосредственно, как это было бы в коде поддержки, например, при ссылке на свойство или метод класса поддержки, что обсуждалось ранее.

Другим распространенным случаем выражений привязки данных в ASP. NET является ссылка на элемент данных контейнера: Под элементом данных, ассоциируемым с элементом управления контейнера, имеется в виду текущая строка или объект в коллекции, к которым производится привязка. Такая конструкция может использоваться в случае, когда элемент управления предназначен для привязки к сильно типизированной коллекции данных, так что компилятор может разрешить для контейнера данных операцию индексатора на текущем элементе данных.

Интерфейс INotifyPropertyChanged: опубликование уведомлений об изменении элемента

тем самым содержащая объект коллекция

Интерфейс INotifyPropertyChanged Позволяет объекту уведомлять свой контейнер о всяком изменении своего свойства. Тем самым содержащая объект коллекция получает возможность возбудить событие ListChanged, Когда изменяется значение одного или нескольких свойств элемента в коллекции. Класс BindingList<T> Использует этот интерфейс, чтобы передавать наверх события ListChanged, Когда объекты его содержимого редактируются либо программно, либо через привязанные элементы управления. Тем самым осуществляется единообразная синхронизация значений объекта, привязанных к нескольким элементам управления. Интерфейс IBindingList Определяет событие ListChanged, Которое предназначено для уведомления клиента коллекции о том, что в списке что-то изменилось. Одним из видов изменения, которые должны поддерживаться, является модификация элементов данных, содержащихся в коллекции. Однако для этого нужен какой-то способ, чтобы уведомлять сам список об изменении элемента в коллекции. Элемент управления может индексировать коллекцию и получить прямую ссылку на объект. Он может различным образом использовать объект и хранить ссылку на него в течение долгого времени. Другие элементы управления, также привязанные к этому объекту, захотят узнавать об изменениях объекта, чтобы в ответ на изменение обновлять свое отображение. Интерфейс INotifyPropertyChanged Предлагает объектам контракт для уведомления своих контейнеров о том, что они изменяются, чтобы контейнер мог передать эту информацию наверх любым привязанным элементам управления. Это очень простой интерфейс. Он определяет единственный элемент-со — бытие PropertyChanged Типа PropertyChangedEventHandler. В сигнатуру события входят обычный Object В качестве первого параметра для отправителя и второй параметр типа PropertyChangedEventArgs. Последний тоже прост: он сообщает имя изменившегося свойства. Получив уведомление о том, что некоторое свойство изменилось, ваш потребляющий код может обновить все, что зависит от этого свойства. Основным потребителем этого интерфейса является класс BindingList<T>, Который использует его для возбуждения событий ListChanged В любых привязанных элементах управления или в компоненте BindingSource, Когда происходит модификация свойств элементов коллекции. Вы увидите в действии этот интерфейс также в примерах главы 9.

Автозавершение ввода в элементе управления TextBox

b такая возможность стала поддерживаться

Следующее требование, которое мы рассмотрим, не имеет прямого отношения к привязке данных, но является общим требованием к интерактивным приложениям: возможность автоматического завершения пользовательского ввода при наборе текста в таких элементах управления, как TextBox Или ComboBox. Такая возможность стала поддерживаться в. NET 2.0, поэтому давайте используем ее для расширения функциональных возможностей фильтрующей сетки. Чтобы разрешить автозавершение для текстового поля, потребуется установить в его свойстве AutoCompleteMode Какое-то значение, отличное от значения по умолчанию None. Возможны варианты Suggest, Append Или SuggestAppend. Suggest Означает, что текстовое поле будет предлагать для выбора выпадающий список возможных строк, подходящих в качестве завершения ввода. Append Означает, что к концу строки, уже набранной пользователем, будет присоединяться наилучшее из возможных завершений; добавленные символы будут выбраны, так что пользователь сможет их перепечатать. SuggestAppend Реализует комбинированное поведение, что скорее всего и подойдет для большинства случаев. Вам потребуется также установить одно из возможных перечислимых значений в свойстве AutoCompleteSource. Возможные здесь варианты включают в себя списки недавно использованных значений, системные списки файлов, списки URL и другие встроенные источники. Так как вы собираетесь генерировать список автоматически в зависимости от источника данных, нужно установить для этого свойства значение CustomSource. Если вы выбираете CustomSource, Вам потребуется еще одно свойство, предусмотренное в элементе управления — AutoCompleteCustom — Source, — в котором предустановлен экземпляр коллекции Auto — CompleteStГIngCollection, Куда вы можете помещать свои строки для автозавершения. Чтобы выполнить все эти установки для элемента управления FilteredGrid, Откройте его в конструкторе, выберите элемент M Filter — TextBox И перейдите в его окно Properties. Первым шагом вспомогательного метода является проверка того, не вызывается ли он во время инициализации, при пустой коллекции данных или при пустом комбинированном поле фильтруемого столбца. Если что-либо из перечисленного верно, то метод просто возвращает управление, так как для построения коллекции строк автозавершения нет достаточной информации. Если необходимые данные имеются, метод прежде всего очищает текущую коллекцию строк, доступную, как уже говорилось, через свойство AutoCompleteCustomSource Текстового поля.