Главная » WPF » Привязка к XML

0

Поддержка  XML в WPF основана на объектной модели документа (DOM), реа лизованной в пространстве имен System.Xml. Мы можем привязаться к части любо го XML документа,  используя объекты XmlDocument, XmlElement или XmlNode в качестве источника.  Свойства  можно привязывать только к атрибуту  или к содер жимому элемента; списки допускают привязку к любому набору элементов.

Знакомство с XPath

Если вы не знакомы с языком XPath, то имеет смысл потратить несколько ми нут на ознакомление с его синтаксисом,  поскольку  механизм  связывания в WPF на него опирается. По существу, XPath – это язык запросов для выделения какой то части XML документа.  Выделить можно набор элементов, отдельный  элемент или даже один атрибут элемента.

Самым  употребительным оператором  в XPath является /. С  его помощью строится  путь к нужному элементу. Рассмотрим следующий  XML документ:

<Media>

<Book Author=’John’ Title=’Fish are my friends’ />

<Book Author=’Dave’ Title=’Fish are my enemies’ />

<Book Author=’Jane’ Title=’Fish are my food’ />

<CD Artist=’Jane’ Title=’Fish sing well’ />

<DVD Director=’John’ Title=’Fish: The Movie’>

<Actor>Jane</Actor>

<Actor>Dave</Actor>

</DVD>

</Media>

Оператор / позволяет сконструировать путь к любому элементу. Так, путь Media / CD ведет к элементу CD. По умолчанию любой текст в пути считается локальным име нем элемента. Для  сложных  XML документов  нужно указывать  пространство  имен XML, но для целей данного краткого введения мы ограничимся простыми документами. Выражение Media / CD в языке XPath означает «выбрать все элементы с именем ‘CD’, которые являются прямыми потомками любого элемента с именем ‘Media’». Будет по нятнее, если взглянуть, что возвращается, когда задан путь Media/CD:

Рис. 6.11. Текста нет!!!

Важное различие между двумя этими примерами состоит в том, что, начав исполь зовать связывание, мы можем отслеживать изменения. Если модифицировать объект XmlDataProvider, то ListBox обновится автоматически. Кроме того, отказавшись от ре ализации выборки в императивном коде, мы перенесли ее в регулярный объект с изве стной семантикой, улучшили  поддержку, которую могут оказать инструментальные средства, и сократили количество понятий, которыми должен владеть разработчик.

Эквивалентная разметка записывается без особого труда:

<Window … Title=’XML Binding’>

<Window.Resources>

<XmlDataProvider x:Key=’dataSource’>

<x:XData>

<Media xmlns=’’>

<Book Author=’John’ Title=’Fish are my friends’ />

<Book Author=’Dave’ Title=’Fish are my enemies’ />

<Book Author=’Jane’ Title=’Fish are my food’ />

<CD Artist=’Jane’ Title=’Fish sing well’ />

<DVD Director=’John’ Title=’Fish: The Movie’>

<Actor>Jane</Actor>

<Actor>Dave</Actor>

</DVD>

</Media>

</x:XData>

</XmlDataProvider>

</Window.Resources>

<ListBox

ItemsSource =

‘{Binding           XPath=/Media/Book/@Title,Source={StaticResource dataSource}}’

/>

</Window>

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

Отметим следующую важную деталь: свойство Source привязки устанавливает ся через StaticResource. Сам объект Binding не является элементом, поэтому мы не можем устанавливать его свойства с помощью динамического ресурса. Если источ ник данных нужно определять  динамически (либо с помощью ссылки на динами ческий ресурс, либо путем привязки), то имеется альтернатива – воспользоваться свойством DataContext (при этом заодно упрощается выражение  привязки):

<Window x:Class=’BookScratch.Window1’ xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’ xmlns:x=’http://schemas.microsoft.com/winfx/2006/xaml’

Text=’XML Binding’

DataContext=’{DynamicResource dataSource}’

<Window.Resources>

<XmlDataProvider x:Key=’dataSource’>

</XmlDataProvider>

</Window.Resources>

<ListBox

ItemsSource= ‘{Binding XPath=/Media/Book/@Title}’ />

</Window>

Познакомившись с привязкой к объектам CLR и к XML, мы можем перейти к следующей важной теме – шаблонам данных, которые дают возможность визуа лизировать данные. Мы использовали шаблоны  данных во всех рассмотренных выше примерах, хотя иногда это было и незаметно.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии