Visual studio как включить привязку данных

Обновлено: 06.07.2024

Почти каждое веб-приложение имеет дело с данными, независимо от того, хранятся они в базе данных, XML-файле, структурированном файле или где-то еще. Извлечение этих данных — лишь часть задачи. Современные приложения также нуждаются в удобном, гибком и привлекательном способе отображения этих данных на веб-странице.

Привязка данных — это средство, которое позволяет ассоциировать источник данных с элементом управления с целью автоматического отображения данных в этом элементе управления. Ключевой характеристикой привязки данных является ее декларативный, а не программный характер. Это значит, что привязка данных определена вне кода, наряду с элементами управления, на странице .aspx. Преимущество состоит в том, что такой подход позволяет достичь более четкого разделения между элементами управления и логикой кода веб-страницы.

Многие веб-элементы управления поддерживают привязку с многократными значениями (repeated-value), это значит, что они могут отображать наборы элементов. Элементы управления с многократными значениями включают списки и экранные таблицы (двумя примерами могут служить ListBox и GridView). Если элемент управления поддерживает такую привязку, он всегда предоставляет свойство DataSource, которое принимает объект данных. (Обычно объекты данных являются некоторого рода коллекцией, а каждый элемент в коллекции представляет запись данных.)

Когда вы устанавливаете свойство DataSource, то тем самым создаете логическую связь серверного элемента управления с объектом данных, который содержит информацию, подлежащую отображению. Однако это не наполняет непосредственно элемент управления данными. Чтобы достичь этого, необходим метод элемента управления DataBind(), который проходит в цикле по DataSource, извлекает данные и обновляет страницу. Привязка с многократными значениями представляет собой наиболее мощный тип привязки.

Оба типа привязки рассматриваются в последующих разделах.

Привязка с одним значением

Это может выглядеть как блок сценария, однако оно таковым не является. Если вы попытаетесь написать любой код внутри дескриптора, то получите ошибку. Единственное, что сюда можно поместить — это допустимое выражение привязки. Например, если есть общедоступная или защищенная переменная по имени EmployeeName, можно написать следующее:

Источник для привязки с одним значением может включать значение свойства, переменную-член или возвращаемое значение функции (до тех пор, пока свойство, переменная-член или функция имеют доступ типа protected, public или internal). Это также может быть любое другое выражение, которое может быть вычислено во время выполнения, такое как ссылка на свойство другого элемента управления или результат вычисления с использованием литеральных значений и операций с ними и т.д. Вот несколько примеров корректных выражений привязки данных:

Размещать выражения привязки данных можно практически в любом месте страницы, но обычно выражение привязки данных присваивается свойству в дескрипторе элемента управления. Рассмотрим пример страницы, использующей несколько выражений привязки данных:

Как видите, можно не только привязать свойство Text элемента управления Label или TextBox, но также использовать и другие свойства, подобные ImageUrl элемента управления Image, NavigateUrl элемента управления HyperLink и даже атрибуту src статического HTML-дескриптора <img>.

Можно также разместить выражение привязки в любом месте страницы, не привязывая его ни к какому свойству или атрибуту. Например, предыдущая веб-страница содержит выражение привязки между дескрипторами <b> и </b>. Во время обработки результирующий текст будет помещен на странице и отображен шрифтом с полужирным начертанием. Можно даже поместить выражение вне раздела <form> до тех пор, пока не пытаетесь туда вставить серверные элементы управления.

Выражения на этой странице примера ссылаются на свойство FilePath, функцию GetFilePath() и свойство Value скрытого поля серверной стороны, которое объявлено на той же странице. Чтобы завершить эту страницу, вы должны определить следующие ингредиенты в блоках сценариев или классе отделенного кода:

Важно помнить, что выражения привязки данных не устанавливают напрямую свойства, к которым они привязаны. Они просто определяют соединение между свойством элемента управления и некоторой порцией информации. Чтобы заставить страницу вычислить выражение, запустить соответствующий код, присвоить соответствующее значение, вы должны вызвать метод DataBind() содержащей страницы.

На рисунке показан результат запуска этой страницы:

Привязка данных одного значения в различных элементах управления

Вызов this.DataBind() часто записывается как Page.DataBind() или просто DataBind(). Эти три оператора эквивалентны. Page.DataBind() работает потому, что все классы элементов управления (включая страницы) наследуют свойство Control.Page. При записи Page.DataBind() в действительности используется свойство Page текущей страницы (указывающее на нее саму), а затем вызывается DataBind() на объекте страницы.

Другие типы выражений

Между $-выражениями и выражениями привязки данных есть несколько отличий:

В отличие от выражений привязки данных, вызывать метод DataBind() для вычисления $-выражений не нужно. Они всегда вычисляются при отображении страницы.

В отличие от выражений привязки данных, $-выражения не могут быть помещены в любое место страницы. Вместо этого их следует поместить в дескриптор элемента управления и использовать результат выражения для установки какого-то свойства элемента управления. Это значит, что если необходимо отобразить результат выражения как обычный текст, то выражение должно быть помещено в дескриптор Literal (как показано в предыдущем примере). Элемент управления Literal выводит свой текст в виде простой неформатированной HTML-разметки.

Формально $-выражения не включают привязку данных, но работают аналогично выражениям привязки и имеют похожий синтаксис.

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

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

Например, предположим, что вы хотите создать собственный построитель выражений, который позволит вставлять случайные числа. Необходима возможность писать дескрипторы, вроде приведенного ниже, чтобы отображать случайное число от 1 до 6:

К сожалению, создание пользовательских построителей выражений не так просто, как можно было ожидать. Проблема связана с тем, как компилируется код. При компиляции страницы, содержащей выражение, с ней также должен быть скомпилирован код вычисления выражения. Однако вы не хотите, чтобы выражение вычислялось в этой точке, а вместо этого желаете, чтобы оно повторно вычислялось при каждом запросе страницы. Чтобы обеспечить такую возможность, построитель выражений нуждается в генерации обобщенного сегмента кода, который решает соответствующую задачу.

Технология, которая позволяет это сделать, называется — модель для динамической генерации конструкций кода. Каждый построитель выражений включает метод по имени GetCodeExpression(), который использует CodeDOM для генерации кода, необходимого выражению. Другими словами, чтобы создать RandomNumberExpressionBuilder, понадобится реализовать метод GetCodeExpression(), который использует CodeDOM для генерации сегмента кода вычисления случайных чисел. Ясно, что это не так просто.

Преимущество такого подхода в том, что при использовании CodeDOM генерируется единственная строка кода, необходимая для вызова метода GetRandomNumber() (вместо кода для собственно генерации случайного числа).

Вот полная структура метода GetCodeExpression():

Теперь этот построитель выражений можно скопировать в папку App_Code (или компилировать его отдельно и поместить DLL-файл сборки в папку Bin). И, наконец, чтобы использовать этот построитель выражений в веб-приложении, понадобится зарегистрировать его в файле web.config и отобразить на подходящий префикс:

Теперь в коде разметки веб-формы можно применять выражения вроде <%$ RandomNumber:1,6 %>. Эти выражения автоматически обрабатываются вашим собственным построителем выражений, который генерирует код при компиляции страницы. Однако код не выполняется до тех пор, пока страница не будет запрошена. При каждом запуске страницы будет отображаться новое случайное число (входящее в нужный диапазон).

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

и добавить к странице соответствующий public- или protected-метод.

Привязка с многократными значениями

Привязка с многократными значениями позволяет связать элемент управления с целым списком информации. Этот список представлен объектом данных, который является оболочкой для коллекции элементов. Это может быть коллекция пользовательских объектов (например, в ArrayList или Hashtable) или коллекция строк (вроде DataReader или Dataset).

Все элементы управления, которые генерируют свой код с использованием дескриптора <select>, включая HtmlSelect, ListBox и DropDownList.

Элементы управления CheckBoxList и RadioButtonList, генерирующие каждый дочерний элемент в виде отдельного флажка или переключателя.

Элемент управления BulletedList, создающий список с метками или пронумерованными пунктами.

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

Установив это свойство, вместо передачи объекта данных в коде можно связать списковый элемент управления с элементом управления источником данных. Элемент управления источником данных сгенерирует требуемый объект данных автоматически. Использовать можно либо свойство DataSource, либо DataSourceID, но не оба сразу

Каждый источник данных представляет коллекцию элементов данных. Списковый элемент управления может отображать только одно значение из каждого элемента списка. DataTextField указывает столбец (в случае строки таблицы) или свойство (в случае объекта) элемента данных, которое содержит значение, отображаемое на странице

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

Это свойство подобно DataTextField, но значение самого элемента данных на странице не отображается. Вместо этого оно сохраняется в атрибуте value лежащего в основе HTML-дескриптора. Это позволяет извлечь значение позже в коде. Главное назначение этого поля — хранить уникальный идентификатор или поле первичного ключа с тем, чтобы вы могли использовать его позднее для извлечения остальных данных, когда пользователь выберет конкретный элемент

Все списковые элементы управления, по сути, одинаковы. Единственное отличие заключается в способе их преобразования в HTML-разметку и в том, позволяют ли они множественное выделение.

На рисунке ниже показана тестовая страница, на которой присутствуют все списочные элементы управления (за исключением BulletedList, который не поддерживает выбор). В данном примере списочные элементы управления привязаны к одному и тому же объекту данных — хеш-таблице. Когда пользователь щелкает на кнопке «Получить выбранные элементы», страница отображает текущие выбранные элементы:

Привязка с многократными значениями в списковых элементах управления

Когда страница загружается первый раз, код создает источник данных и присваивает его всем списочным элементам управления. В данном примере объектом данных является экземпляр Hashtable, который содержит последовательности строк (значений), проиндексированных именами (ключами).

Коллекция Hashtable работает точно так же, как коллекции ViewState, Session, Application и Cache, которые можно использовать для хранения данных. Ниже приведен код создания и привязки хеш-таблицы:

Каждый элемент управления, поддерживающий привязку с многократными значениями, включает метод DataBind(). Этот метод можно вызывать для привязки конкретного элемента управления. Однако когда вызывается метод Page.DataBind(), объект страницы вызывает DataBind() для каждого содержащегося в нем элемента управления, что существенно облегчает жизнь.

Каждая пара "ключ-значение" в хеш-таблице представлена экземпляром класса DictionaryStructure. Класс DictionaryStructure определяет два свойства: Value (действительное хранимое значение, в данном случае — строка) и Key (уникальное имя, под которым индексировано значение). Когда вы привязываете хеш-таблицу к списочному элементу управления, то в действительности привязываете группу объектов DictionaryStructure.

В рассматриваемом примере привязанные элементы управления отображают для каждого элемента свойство Value, содержащее текст. Также они отслеживают свойство Key для последующего использования. Чтобы обеспечить это, понадобится установить свойства списков DataTextField и DataValueField, как показано ниже:

Когда пользователь щелкает на кнопке «Получить выбранные элементы», код добавляет имя и значения выбранных элементов к метке. Вот код, решающий эту задачу:

Привязка к DataReader

В предыдущем примере в качестве источника данных используется Hashtable. Конечно, базовые коллекции — не единственный вид источников данных, которые можно использовать для привязки списков. На самом деле можно привязывать любые структуры данных, реализующие интерфейс ICollection или его производные. В следующем списке перечислены многие из таких классов данных:

Полностью содержащиеся в памяти классы коллекций, такие как Collection, ArrayList, Hashtable и Dictionary.

Любой другой пользовательский объект, реализующий интерфейс ICollection.

Например, предположим, что необходимо заполнить окно списка полными именами всех сотрудников, хранящихся в таблице Employees базы данных Northwlnd. На рисунке ниже показан результат, который может при этом получиться:

Привязка данных с помощью DataReader

Информация в этом примере для каждой персоны включает имя и фамилию, которые хранятся в двух разных полях. К сожалению, свойство DataTextField ожидает имя только одного поля. Использовать привязку данных для соединения этих двух фрагментов данных и создания значения для DataTextField не получится. Однако эту проблему можно решить посредством простого, но эффективного трюка — использования вычисляемого столбца. Для этого понадобится просто модифицировать запрос SELECT так, чтобы он создавал вычисляемый столбец, содержащий информацию из этих двух полей. Затем этот столбец можно применять в DataTextField. Необходимая команда SQL выглядит следующим образом:

Привязанное к данным окно списка объявляется на странице так:

Когда страница загружается, она извлекает записи из базы данных и привязывает их к списковому элементу управления. В этом примере в качестве источника данных используется DataReader, как показано ниже:

В приведенном примере кода создается подключение к базе данных, формируется команда, которая выберет данные, открывается соединение и выполняется команда, возвращающая DataReader. Возвращенный объект DataReader привязывается к окну списка и, наконец, DataReader и подключение закрываются. Обратите внимание, что метод DataBind() страницы или элемента управления должен быть вызван перед закрытием подключения. До вызова этого метода данные извлекаться не будут.

Последняя часть этого примера — код для определения выбранных элементов. Как и в предыдущем примере, код достаточно прост:

Если вместо ListBox нужно использовать DropDownList, CheckListBox или RadioButtonList, то для этого достаточно изменить объявление элемента управления. Часть кода, которая устанавливает привязку данных, останется прежней.

Многофункциональные элементы управления данными

GridView

DetailsView

Идеальный выбор для показа одной записи за раз в таблице, имеющей одну строку на поле. DetailsView поддерживает редактирование и необязательно возможность перемещения по страницам, что позволяет просматривать последовательности записей.

FormView

Как и DetailsView, элемент FormView отображает по одной записи за раз, поддерживает редактирование и предоставляет элементы управления для перемещения по последовательности записей. Отличие состоит в том, что FormView основан на шаблонах, а это позволяет комбинировать поля гораздо более гибким образом, не обязательно основанным на таблице.

Многофункциональные элементы управления данными более подробно рассматриваются в последующих статьях. Однако сейчас стоит взглянуть на краткий пример использования GridView, поскольку этот элемент применяется во многих примерах.

Как и списковые элементы управления, GridView предоставляет свойство DataSource для объектов данных и метод DataBind(), который инициирует чтение им объекта данных и отображение каждой записи. Однако вам не нужно использовать свойства, такие как DataTextField и DataValueField, потому что GridView автоматически генерирует столбцы для каждого свойства (если привязка осуществляется к пользовательскому объекту) или для каждого поля (если привязка выполнена к строке). Вот все, что нужно для базового представления:

Формально даже не понадобится устанавливать свойство AutoGenerateColumns, т.к. true является значением по умолчанию. Теперь определим запрос, который выберет несколько столбцов из таблицы Employees и заполним GridView:

На рисунке ниже показан элемент GridView, созданный этим кодом:

Простой элемент GridView

Разумеется, можно сделать намного больше для настройки внешнего вида GridView и применить расширенные средства вроде сортировки, листания страниц и редактирования (это будет продемонстрировано позже).

Привязка к DataView

При выполнении привязки непосредственно к DataReader вы столкнетесь с рядом ограничений. Поскольку DataReader — однонаправленный курсор, привязать данные к множеству элементов управления невозможно. Также не удастся применить пользовательскую сортировку и фильтрацию "на лету".

Формально привязка никогда не выполняется к объекту DataSet или DataTable. Вместо этого вы привязываетесь к объекту DataView. Объект DataView представляет вид данных в специфическом объекте DataTable. Это значит, что следующий код:

Для пользователей приложения данные можно отображать путем привязки данных к элементам управления. Эти элементы управления с привязкой к данным можно создать путем перетаскивания элементов из окна Источники данных в область конструктора или элементы управления на поверхности Visual Studio.

В этом разделе описываются источники данных, которые можно использовать для создания элементов управления с привязкой данных. Также здесь описываются некоторые общие задачи, относящиеся к привязке данных. более подробные сведения о создании элементов управления с привязкой к данным см. в разделе привязка Windows Forms элементов управления к данным в Visual Studio и привязка элементов управления WPF к данным в Visual Studio.

Источники данных

Создайте модель с помощью мастера EDM , а затем перетащите эти объекты в конструктор.

Классы LINQ to SQL не отображаются в окне Источники данных. Однако можно добавить новый источник данных объектов, основанный на классах LINQ to SQL, а затем перетащить нужные объекты в конструктор, чтобы создать элементы управления с привязкой к данным. дополнительные сведения см. в разделе пошаговое руководство. создание классов LINQ to SQL (O-R Designer).

Источники данных - окно

Источники данных доступны в проекте как элементы в окне Источники данных. это окно отображается, если область конструктора формы является активным окном в проекте, или ее можно открыть (когда проект открыт), выбрав просмотреть > другие Windows > источники данных. Можно перетаскивать элементы из этого окна для создания элементов управления, привязанных к базовым данным, а также настраивать источники данных, щелкнув правой кнопкой мыши.

Источники данных - окно

Для каждого типа данных в окне Источники данных создается элемент управления по умолчанию в момент перетаскивания элемента в конструктор. Перед перетаскиванием элемента из окна Источники данных можно изменить созданный элемент управления. Дополнительные сведения см. в разделе Установка элемента управления, создаваемого при перетаскивании из окна Источники данных.

Задачи, решаемые в процессе привязки элементов управления к данным

В следующей таблице перечислены некоторые из наиболее распространенных задач, выполняемых для привязки элементов управления к данным.

Visual Studio предоставляет средства времени разработки для работы с пользовательскими объектами в качестве источника данных в приложении. Если требуется хранить данные из базы данных в объекте, привязанном к элементам управления пользовательского интерфейса, рекомендуется использовать Entity Framework для создания класса или классов. Entity Framework автоматически создает весь стандартный код отслеживания изменений, что означает, что любые изменения локальных объектов автоматически сохраняются в базе данных при вызове метода AcceptChanges для объекта DbSet. Дополнительные сведения см. в документации по Entity Framework.

Требования к объектам

единственным требованием для пользовательских объектов при работе со средствами проектирования данных в Visual Studio является то, что объекту требуется по крайней мере одно общее свойство.

Примеры использования пользовательских объектов в качестве источников данных

хотя существует множество способов реализации логики приложения при работе с объектами в качестве источника данных, для SQL баз данных существует несколько стандартных операций, которые можно упростить с помощью созданных Visual Studio объектов TableAdapter. На этой странице объясняется, как реализовать эти стандартные процессы с помощью адаптеров таблиц TableAdapter. Он не предназначен для создания пользовательских объектов. Например, вы обычно выполняете следующие стандартные операции независимо от конкретной реализации объектов или логики приложения:

Загрузка данных в объекты (обычно из базы данных).

Создание типизированной коллекции объектов.

Добавление объектов в коллекцию и удаление объектов из коллекции.

Отображение данных объекта для пользователей в форме.

Изменение или изменение данных в объекте.

Сохранение данных из объектов обратно в базу данных.

Загрузка данных в объекты

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

TableAdapter.Fill Метод заполняет существующую таблицу данных возвращаемыми данными.

TableAdapter.GetData Метод возвращает новую таблицу данных, заполненную данными.

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

Visual Studio имена запросов TableAdapter Fill и по GetData умолчанию, но эти имена можно изменить на любое допустимое имя метода.

В следующем примере показано, как выполнить перебор строк в таблице данных и заполнить объект данными:

Создание типизированной коллекции объектов

Можно создавать классы коллекций для объектов или использовать типизированные коллекции, которые автоматически предоставляются компонентом BindingSource.

При создании пользовательского класса коллекции для объектов мы рекомендуем наследовать от BindingList<T> . этот универсальный класс предоставляет функциональные возможности для администрирования коллекции, а также возможность создавать события, отправляющие уведомления в инфраструктуру привязки данных в Windows Forms.

Автоматически созданная коллекция в коллекции BindingSource использует BindingList<T> для своей типизированной коллекции. Если приложению не требуются дополнительные функции, вы можете поддерживать коллекцию в BindingSource . Дополнительные сведения см. в описании List свойства BindingSource класса.

Если для вашей коллекции требуются функции, не предоставляемые базовой реализацией BindingList<T> , следует создать пользовательскую коллекцию, чтобы при необходимости можно было добавить в класс.

В следующем коде показано, как создать класс для строго типизированной коллекции Order объектов:

Добавление объектов в коллекцию

Объекты добавляются в коллекцию путем вызова Add метода пользовательского класса коллекции или BindingSource .

Add Метод предоставляется автоматически для пользовательской коллекции при наследовании от BindingList<T> .

В следующем коде показано, как добавить объекты в типизированную коллекцию в BindingSource :

В следующем коде показано, как добавить объекты в типизированную коллекцию, наследующую от BindingList<T> :

В этом примере Orders коллекция является свойством Customer объекта.

Удаление объектов из коллекции

Объекты из коллекции удаляются путем вызова Remove RemoveAt метода или пользовательского класса коллекции или BindingSource .

Remove Методы и RemoveAt автоматически предоставляются для пользовательской коллекции при наследовании от BindingList<T> .

В следующем коде показано, как выполнять обнаружение и удаление объектов из типизированной коллекции в BindingSource с помощью RemoveAt метода:

Отображение данных объекта для пользователей

Чтобы отобразить данные в объектах для пользователей, создайте источник данных объекта с помощью мастера настройки источника данных , а затем перетащите весь объект или отдельные свойства в форму из окна Источники данных .

Изменение данных в объектах

чтобы изменить данные в пользовательских объектах, привязанных к Windows Forms элементам управления, просто измените данные в связанном элементе управления (или непосредственно в свойствах объекта). Архитектура привязки данных обновляет данные в объекте.

Если приложение требует отслеживания изменений и отката предложенных изменений их исходных значений, необходимо реализовать эту функциональность в объектной модели. Примеры того, как таблицы данных отслеживают предлагаемые изменения, см DataRowState . в статьях, HasChanges и GetChanges .

Сохранение данных в объектах обратно в базу данных

Сохраните данные обратно в базу данных, передав значения из объекта в методы DBDirect адаптера таблицы.

Visual Studio создает методы DBDirect, которые могут выполняться непосредственно в базе данных. Для этих методов не требуется набор данных или объекты DataTable.

Чтобы сохранить данные из коллекции объектов, пройдите по коллекции объектов (например, с помощью цикла For-Next). Отправьте значения для каждого объекта в базу данных с помощью методов DBDirect адаптера таблицы.

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

Итак, кратко рассмотрим, как мы можем установить подключение привязки данных при помощи WPF. Ключевым здесь является класс System.Windows. Data.Binding. Он вы­ступает посредником, отвечающим за связь элемента управления с источником данных. Для успешного объявления привязки нам нужно знать три вещи:

□ Какое свойство элемента управления пользовательского интерфейса мы хотим привя­зать?

□ К какому источнику данных мы хотим привязаться?

□ Какой конкретно элемент или свойство внутри источника данных содержит интере­сующие нас данные?

Мы можем привязаться либо к единичным объектам (привязка строкового свойства объекта к текстовому полю), либо к коллекциям объектов (привязка коллекции Listo к списку). В любом случае механизм остается тем же самым:

Binding binding = new Binding(); binding.Source = _stringList;

Предыдущий фрагмент кода создает объект Binding, настраивает нашу коллекцию List<string> в качестве источника объекта Binding, а затем для нашего элемента управ­ления (ListBox) вызывает SetBinding, передавая в него экземпляр объекта Binding и то свойство элемента управления, к которому мы хотим привязать наш источник данных.

Вы можете также присвоить источники данных специальному объекту, который называется контекстом данных. Каждый объект FrameworkElement (а также и те, которые наследуют от этого класса) реализует собственный экземпляр DataContext. Вы можете представлять его себе как некую глобальную область, куда элементы управления могут обращаться за получением своих данных (при участии в цепочке привязки данных).

Это значительно упрощает наш код привязки данных. Мы можем настроить контекст в кон­структоре Window следующим образом:

Теперь мы просто указываем этот контекст данных при помощи тега в XAML-элементе для ListBox:

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

Это хорошо работает для нашего простого примера List<string>, но что если мы попыта­емся привязать к списку целую коллекцию нестандартных объектов? Если у нас есть про­стой класс Employee со свойствами Name и PhoneNbr, то как нам привязать коллекцию этих объектов и показать имя сотрудника? Процесс останется таким же. Если мы создаем класс Employee, а затем создаем коллекцию List<Employee>, то весь этот код по-прежнему работает. Но есть и проблема. Она показана на рис. 16.18.

Рис. 16.18. Привязка к нестандартным объектам

Мы еще не сказали движку привязки, как именно мы хотим представить наши данные в спи­ске. По умолчанию процесс привязки просто вызовет Tostring для каждого объекта.

Быстрым решением этой проблемы было бы просто перекрыть метод Tostring: public override string ToString()

В данном случае это решит проблему. Но более надежный подход потребует использования DataTemplate. Мы опишем этот подход в разд. "Создание простого приложения для про­смотра изображений" далее в этой главе.

Читайте также: