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

Спецификация свойств привязки для элемента управления

для идентификации этих свойств специального

Если вы хотите, чтобы конструктор позволял устанавливать привязки данных для вашего элемента управления посредством операций перетаскивания, он должен знать, предназначен ли ваш элемент управления для простой или для сложной привязки, и какие его свойства следует устанавливать в ответ на эти операции. Для идентификации этих свойств специального элемента управления вы должны добавить соответствующий атрибут к определению его класса, чтобы окно Data Sources могло с ним работать. Используемые для этого атрибуты описаны в таблице 8.1. Таким образом вы получаете требуемые интерактивные функции в окне Properties, но при попытке перетащить источник данных из окна Data Sources курсор мыши все еще будет указывать на недопустимость такой операции. Чтобы это исправить, нужно добавить соответствующий атрибут привязки к самому классу.FilteredGndl CustomControts.FiiteredGrid Поскольку FilteredGrid Представляет собой элемент управления со сложной привязкой, Два параметра в конструкторе этого атрибута специфицируют имена свойств для установки соответственно источника данных и компонента данных элемента управления. Я рекомендую придерживаться обычного соглашения об их наименовании , Как сделано и в элементе управления FilteredGrid. Теперь можно перетаскивать источники данных из окна Data Sources на элемент управления, при этом конструктор генерирует все необходимые объекты и соответствующим образом подключит их к вашим свойствам Datasource И DataMember.

Заключение форм внутрь родительской формы

а что если вы хотите

В предыдущем разделе было показано, как запустить новую форму, которую можено перемещать по экрану независимо тот формы, из которой она была запущена, хотя период жизни этого окна и привязан к тому окну, которое его создало. А что, если вы хотите создать форму, которая была бы полностью заключена внутри области клиента ее родительского окна? Такой стиль пользовательского интерфейса называется многодокументным интерфейсом, даже если то, что содержится в дочерних формах, может быть вообще не ориентировано на документы. Эта терминология является пережитком, оставшимся от тех времен, когда ранние версии программ вроде Microsoft Word или Excel открывали каждый документ в дочернем окне, которое содержалось внутри внешнего окна, или обрамления, представлявшего собственно приложение. Большинство этих программ сместило свою ориентацию от центрированной на приложении к более центрированной на документе, и теперь отображают для каждого открытого документа отдельное окно верхнего уровня. Тем не менее введенный ими стиль приложений еще встречается и во многих ситуациях вполне оправдан. Создание MDI-приложений в Windows Forms намного проще, чем это было в C++ или VB6. Прежде всего вам нужно спроектировать вашу главную форму, как вы это сделали бы для любого другого приложения. Так как вы разрабатываете приложение MDI, вам нужно будет оставить область клиента главной формы пустой, так как именно там будут отображаться дочерние формы. Обычно в главной форме MDI-приложения у вас будет только меню, инструментальная панель и строка состояния. Вам нужно будет спроектировать также любые формы, которые вы хотите заключить в область клиента главной формы в качестве дочерних форм.

Как только вы спроектируете формы, останется сделать всего два шага, чтобы запустить дочерние формы таким образом, что они будут заключены внутри области клиента родительской формы. Прежде всего вам нужно установить свойство IsMdiContainer Родительской формы в True. Затем, когда вы конструируете дочерние формы, но до того, как вы вызовете их метод Show, Вы должны установить в свойстве MdiParent Дочерней формы ссылку на родительскую форму:

Создание коллекций и объектов, поддерживающих весь спектр привязки данных

я большой сторонник использования в

Создание коллекций и объектов, поддерживающих весь спектр привязки данных, требует массы работы. Я большой сторонник использования в качестве контейнеров для рабочих данных типизированных наборов данных, а не специально определенных объектов, когда их предполагается применять в сценариях привязки данных. Одним из главных доводов в их пользу является то, что набор данных и содержащиеся в нем объекты уже все делают за вас, хорошо проверенным и апробированным образом. В частности, классы Dataview и Data — Rowview предусматривают полную реализацию всех рассмотренных интерфейсов, они будут отлично работать почти с любыми видами данных, которые вам потребуется в них поместить. Если вы передаете данные на уровень представления для привязки данных, вашим первым побуждением должно быть применение для них в качестве контейнера набора данных вместо того, чтобы в интересах объектно-ориентированной чистоты проделывать всю массу работы по корректной реализации объектов и коллекций, которая обеспечит всего лишь их пригодность для привязки данных. Вот некоторые ключевые выдержки из этой главы: Класс DataSet И содержащиеся в нем объекты уже делают за вас все необходимое, поэтому везде, где это возможно, используйте типизированные наборы данных, чтобы не создавать заново все те контейнерные функции, которые уже за вас написаны. Для сильно типизированных классов коллекций, поддерживающих привязку данных, предпочтительнее использовать BindingList<T>. Создавайте классы, производные от BindingList<T>, Чтобы добавить поддержку для сортировки, поиска и фильтрации. Добавьте реализацию INotifyPropertyChanged, Чтобы поддерживать уведомления ListChanged От коллекции BindingList<T>, Когда изменяются значения свойств. Следующая глава заканчивает рассмотрение концепций, стоящих за созданием привязанных к данным приложений Windows Forms, обсуждением верификации и обработки ошибок — двух ключевых моментов построения развитых и надежных приложений, работающих с данными, которые делают именно то, что ожидает от них пользователь. В ней обсуждаются встроенные механизмы верификации и обработки ошибок в элементах управления Windows Forms, а также то, как дополнить имеющиеся функции, чтобы не писать всякий раз один и тот же код верификации и обработки ошибок

Определение специальных типов ячеек и столбцов

однако всегда встречаются особые сценарии

Имея DataGridView, Вы обладаете возможностями представления сложных данных, далеко опережающими возможности DataGrid Благодаря встроенным типам столбцов, которые поддерживаются уже в готовом виде. Однако всегда встречаются особые сценарии, в которых вам понадобится поддерживать отображение столбцов специального вида. К счастью, другим важНыМ преимуществом DataGridView Является простота подключения специальных типов столбцов и ячеек. Если вы хотите настроить только процесс рисования ячейки, но не собираетесь вводить каких-либо новых свойств или средств управления на уровне столбца, у вас есть возможность воспользоваться событиями, а не создавать для этого новые типы столбцов и ячеек. Вы можете обрабатывать событие CellPainting И рисовать прямо в ячейке, при этом можно осуществить многое из того, что вам потребуется, при помощи встроенных типов ячеек и некоторого кода рисования. Но если вы хотите подключать к сетке свои собственные утилизируемые типы столбцов или ячеек с той же легкостью, как используются встроенные типы, то можете создать свои собственные производные классы столбцов и ячеек. Модель, которой вы следуете при подключении специальных типов столбцов, совпадает с той, что вы уже видели при использовании встроенных типов: вам нужно создать тип столбца и соответствующий тип ячеек, которые будут содержаться в столбце. Это делается путем наследования от базовых классов DataGridViewColumn И DataGridViewCell, Непосредственно или косвенно, через один из встроенных классов. Лучше всего объяснить это в подробностях на примере. Допустим, я хочу реализовать специальный тип столбца, позволяющий отображать состояние элементов, представляемых строками сетки. Мне хотелось бы устанавливать состояние, используя перечислимые значения, а ячейка будет графически индицировать состояние в зависимости от установленного для ячейки перечислимого значения. Для этого я определяю классы statusCo-Lumn И StatusCell .

Простое приложение с привязкой к данным

метод b main b как

Показан класс приложения для этого примера. Метод Main, Как и раньше, создает экземпляр вашего производного класса приложения и приводит его в действие. При запуске приложения вызывается замещающий метод OnStartingUp, Который позволяет вам создать главное окно и разместить в нем элементы управления. В этом примере я в качестве контейнера верхнего уровня воспользовался элементом управления StackPanel, Чтобы расположить элементы управления вертикально, один над другим. Одним из его дочерних элементов является сетка, которая содержит элементы управления TextBlock И TextField, Отображающие привязанные поля строки. Основная часть кода выполняет элементарные операции WinFx для создания и расположения элементов управления, и аналогична коду на листинге Б.1. Строки кода, относящиеся к привязке данных, выделены жирным шрифтом. Win.DataContext = Custs;Вызовы метода SetBinding Для поля списка и текстовых полей задают путь в контексте данных для этих элементов управления. В случае поля списка свойством, определяющим привязку, является ItemSource, А привязывается оно к экземпляру класса Binding, Создаваемому по умолчанию. Метод SetBinding Принимает аргумент типа DependencyProperty, Предоставляющий информацию о типе свойства в привязанном объекте, которое подлежит привязке, и путь внутри контекста данных. Этот путь будет использоваться во время выполнения для динамического разрешения привязки в соответствии с текущим контекстом данных и информацией о пути, предоставляемой экземпляром объекта Binding. Когда вы создаете экземпляр объекта Binding По умолчанию, в качестве пути устанавливается корень контекста данных. Альтернативно можно задать, как для текстовых полей, путь к подобъекту или коллекции. Для текстовых полей идентифицируется имя свойства в объектах коллекции, которое используется для заполнения свойства Text В TextBox. Данными, с которыми работает этот пример, является специальная коллекция объектов Customer, Создаваемая в обработчике события Window — Loaded И задаваемая в качестве контекста данных для окна через его свойство DataContext. Конструктор по умолчанию класса CustomersCollection Помещает в коллекцию три тестовых объекта, которые мы и видим во время выполнения. После установки контекста данных обновляются привязки всех дочерних элементов управления, и отыскиваются их пути внутри этого контекста.