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

57

Если вы занимаетесь разработкой прикладных программ на платформе .NET, то хорошо знаете, что на ней поддерживаются различные программные средства для манипулирования данными в формате XML, в том числе исходное пространство имен System.Xml и прикладной интерфейс LINQ to XML API. Так, если данные XML требуется видоизменить во время выполнения приложений на платформе WPF или Silverlight, например, добавить, обновить или видоизменить новые элементы, для этого придется прибегнуть к написанию процедурного кода.

Но в среде Expression Blend IDE предоставляется также возможность привязывать элементы пользовательского интерфейса к данным, содержащимся в XML-документе, используя источник данных XML, выбираемым на нанели Data.

К сожалению, возможность привязывать данные XML к элементам пользовательского интерфейса с помощью источника данных XML имеется только для приложений на платформе WPF. Разумеется, данными XML можно манипулировать и в приложениях на платформе Silverlight, но для этого придется написать процедурный код. За дополнительными сведениями и примерами манипулирования данными XML в приложениях на платформе Silverlight обращайтесь к документации по Silverlight.

Учитывая, что привязка данных из XML доступна только на платформе WPF, создайте новый проект приложения WPF с именем WpfXmlDataBinding. Ниже приведен пример XML-файла, данными которого мы будем манипулировать:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Products>
    <ProductID>1</ProductID>
    <ModelNumber>RU007</ModelNumber>
    <ModelName>Rain Racer 2000</ModelName>
    <UnitCost>1499.9900</UnitCost>
    <Description>Looks like an ordinary bumbershoot, but don't be fooled! Simply place Rain Racer's tip on the ground and press the release latch. Within seconds, this ordinary rain umbrella converts into a two-wheeled gas-powered mini-scooter. Goes from 0 to 60 in 7.5 seconds - even in a driving rain! Comes in black, blue, and candy-apple red.</Description>
    <CategoryName>Travel</CategoryName>
  </Products>
  <Products>
    <ProductID>356</ProductID>
    <ModelNumber>STKY1</ModelNumber>
    <ModelName>Edible Tape</ModelName>
    <UnitCost>3.9900</UnitCost>
    <Description>The latest in personal survival gear, the STKY1 looks like a roll of ordinary office tape, but can save your life in an emergency.  Just remove the tape roll and place in a kettle of boiling water with mixed vegetables and a ham shank. In just 90 minutes you have a great tasking soup that really sticks to your ribs! Herbs and spices not included.</Description>
    <CategoryName>General</CategoryName>
  </Products>
  <Products>
    <ProductID>357</ProductID>
    <ModelNumber>P38</ModelNumber>
    <ModelName>Escape Vehicle (Air)</ModelName>
    <UnitCost>2.9900</UnitCost>
    <Description>In a jam, need a quick escape? Just whip out a sheet of our patented P38 paper and, with a few quick folds, it converts into a lighter-than-air escape vehicle! Especially effective on windy days - no fuel required. Comes in several sizes including letter, legal, A10, and B52.</Description>
    <CategoryName>Travel</CategoryName>
  </Products>
</NewDataSet>

Введите этот файл (или свой собственный XML-файл) в текущий проект но команде меню Project --> Add Existing Item. В итоге этот файл появится на панели Projects.

Для привязки данных из XML-файла на панели Data его совсем не обязательно включать в проект, но благодаря этому упрощается открытие данного файла для последующей правки в среде Expression Blend IDE.

Ввод источника данных XML

Сначала откройте файл разметки главного окна в окне монтажного стола, а затем перейдите к панели Data и введите новый источник данных XML:

Ввод нового источника данных XML

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

Новый источник данных XML на панели Data

Привязка данных XML к элементам пользовательского интерфейса с помощью оператора XPath

Теперь, когда определен источник данных XML, можете перетащить узлы из панели Data на монтажный стол, подобно тому, как это делали ранее с источником данных объекта. Так, если перетащить весь узел Products, Expression Blend автоматически сформирует элемент управления типа ListBox, в котором отображаются все данные каждого элемента разметки XML:

<ListBox HorizontalAlignment="Left" 
		         ItemTemplate="{DynamicResource ProductsTemplate}" 
		         ItemsSource="{Binding XPath=/NewDataSet/Products}" Margin="97,82,0,64" Width="200"/>

Кроме того, в автоматически сформированном шаблоне, указанном и свойстве ItemTemplate, используются дополнительные операторы XPath для привязки различных атрибутов и узлов, подчиненных узлу <Products>:

<DataTemplate x:Key="ProductsTemplate">
			<StackPanel>
				<TextBlock Text="{Binding XPath=CategoryName}"/>
				<TextBlock Text="{Binding XPath=Description}"/>
				<TextBlock Text="{Binding XPath=ModelName}"/>
				<TextBlock Text="{Binding XPath=ModelNumber}"/>
				<TextBlock Text="{Binding XPath=ProductID}"/>
				<TextBlock Text="{Binding XPath=UnitCost}"/>
			</StackPanel>
		</DataTemplate>

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

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

В руководстве пользователя Expression Blend приводится очень интересный пример демонстрирующий применение источника данных XML для привязки к веб-каналу. Если вас интересует этот вопрос, обращайтесь за справкой к разделу "Пример создания программы для чтения новостей из веб-канала" (Try it: Create an RSS news reader).

Пройди тесты
Лучший чат для C# программистов