- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
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 — простая односторонняя и не обновляемая.
