Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wpf-АК11.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

6. Привязка к xml

Язык XML сегодня широко используется для хранения сведений о конфигурации и обмена данными и даже для разработки интерфейса пользователя. Не забывайте, XAML — производный язык XML.

Но это не все, для чего можно использовать данные XML. К ним еще можно выполнять привязку. В XAML сделать это довольно просто: либо код XAML может содержать данные XML (что, впрочем, кажется не слишком нормальным), либо можно использовать внешние файлы XML.

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

В состав демонстрационного решения входит проект BindingToXML, который при выполнении выглядит так (рис. 7.3):

Рис. 7.3 - Демонстрационная программа

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

XmlDataProvider с использованием данных, содержащихся в коде XAML (встроенных данных XML).

Все данные XML могут находиться в файле XAML и использоваться как источник привязки. Рассмотрим эту ситуацию.

<Window x:Class="BindingToXML.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   WindowStartupLocation="CenterScreen"

   Title="Window1" Height="800" Width="800">

   <Window.Resources>

       <!-- встроенные данные XML -->

       <XmlDataProvider x:Key="xmlData" XPath="Films">

           <x:XData>

               <Films xmlns="">

                   <Film Type="Horror" Year="1987">

                       <Director>Sam Raimi</Director>

                       <Title>Evil Dead II</Title>

                   </Film>

                   <Film Type="Murder" Year="1991">

                       <Director>Jonathan Demme</Director>

                       <Title>Silence Of The Lambs</Title>

                   </Film>

                   <Film Type="Sc" Year="1979">

                       <Director>Ridley Scott</Director>

                       <Title>Alien</Title>

                   </Film>

               </Films>

           </x:XData>

       </XmlDataProvider>

   </Window.Resources>

   <ScrollViewer>

       <StackPanel Orientation="Vertical">

           <!--Простая привязка XPath с использованием встроенных данных XML -->

           <Label Content="Show all Films (using inline XML data)"

                   Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

           <StackPanel Orientation="Horizontal" Margin="10,10,10,10"

                   Background="Gainsboro">

               <ListBox ItemsSource="{Binding Source={StaticResource xmlData},

                   XPath=Film/Title}"/>

           </StackPanel>

           <!-- Более сложная привязка XPath с использованием встроенных данных XML -->

           <Label Content="Show Only Films After 1991 (using inline XML data)"

                   Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

           <StackPanel Orientation="Horizontal" Margin="10,10,10,10"

                   Background="Gainsboro">

               <ListBox ItemsSource="{Binding Source={StaticResource xmlData},

                   XPath=*[@Year>\=1991]}"/>

           </StackPanel>

          </StackPanel>

   </ScrollViewer>

</Window>

В этом примере поставщик XmlDataProviderиспользует встроенный (в код XAML) набор данных XML. И этот объект XmlDataProviderиспользуется как источник привязки для элемента ListBox. В первом элементе ListBox показаны все жанры и названия фильмов, поскольку выбирается весь набор узлов Film/Title с использованием выражения Binding.XPath=Film/Title, то есть отображаются все названия.

Второй элемент ListBox более разборчив. В нем для обхода оси атрибутов используются запросы XPath и выбираются только те узлы, у которых Year > 1991, поэтому возвращается меньше узлов.

XmlDataProvider с использованием внешнего файла XML. С объектом XmlDataProvider чаще используются внешние файлы XML. Для этого свойству Source объекта XmlDataProviderприсваивается имя внешнего файла XML.

<XmlDataProvider x:Key="xmlDataSeperateFile" XPath="Resteraunts" Source="XMLFile1.xml">

</XmlDataProvider>

Это выражение, по сути, похоже на использованное выше, где запрос XPath применялся для выбора всех узлов или узлов, атрибуты которых отвечают заданным требованиям. В этом примере во втором элементе ListBoxпоказаны только мексиканские рестораны из файла XML. Для этого использовался следующий запрос XPath.

<ListBox ItemsSource="{Binding Source={StaticResource xmlDataSeperateFile}, XPath=*[@Type\=\'Mexican\']}"/>

Ниже приведен весь пример.

<Window x:Class="BindingToXML.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   WindowStartupLocation="CenterScreen"

   Title="Window1" Height="800" Width="800">

   <Window.Resources>

       <!-- внешние данные XML -->

       <XmlDataProvider x:Key="xmlDataSeperateFile" XPath="Resteraunts"

           Source="XMLFile1.xml">

       </XmlDataProvider>

   </Window.Resources>

   <ScrollViewer>

       <StackPanel Orientation="Vertical">

             <!-- Простаяпривязка XPath сиспользованиемотдельныхданных XML -->

           <Label Content="Show all Resteraunts (using seperate XML data)"

               Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

           <StackPanel Orientation="Horizontal" Margin="10,10,10,10"

                   Background="Gainsboro">

               <ListBox ItemsSource="{Binding Source=

                   {StaticResource xmlDataSeperateFile},

                   XPath=Resteraunt/Name}"/>

           </StackPanel>

           <!-- Более сложная привязка XPath с использованием отдельных данных XML -->

           <Label Content="Show Only Mexican Resteraunts (using inline XML data)"

                   Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

           <StackPanel Orientation="Horizontal" Margin="10,10,10,10"

                   Background="Gainsboro">

               <ListBox ItemsSource="{Binding Source={StaticResource xmlDataSeperateFile},

                   XPath=*[@Type\=\'Mexican\']}"/>

           </StackPanel>

       </StackPanel>

   </ScrollViewer>

</Window>

Нижесоответствующийфайл XML.

<?xml version="1.0" encoding="utf-8" ?>

<Resteraunts xmlns="">

 <Resteraunt Type="Meat">

   <Name>The MeatHouse</Name>

   <Phone>01237 78516</Phone>

   <email>yada@here.com</email>

 </Resteraunt>

 <Resteraunt Type="Veggie">

   <Name>VegHead</Name>

   <Phone>99999</Phone>

   <email>mmm-vegies@here.com</email>

 </Resteraunt>

 <Resteraunt Type="Mexican">

   <Name>Mexican't (El Mariachi)</Name>

   <Phone>464654654</Phone>

   <email>mex@here.com</email>

 </Resteraunt>

</Resteraunts>

Примечание. Можна использовать XML для определения значений привязки, но обновлять данные XML, просто присваивая свойству Binding.Modeзначение TwoWay, не удастся. Метод не сработает потому, что привязка данных XML — простая односторонняя и не обновляемая.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]