WPF (Windows Presentation Fundation)

Главная | Исходники | Книги | Ссылки |

Использование XMLDataProvider и связывание с данными

Напишем пример программы, которая будет состоять из приложения WPF с одним окном и XML файл, который будет содержать используемы данные. Я являюсь поклонником спортивного покера, поэтому пример данных файл PokerPersons.xml будет представлять из себя реальное имя человека и ники на сайтах PokerStars и FullTiltPoker

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  3.  <Person>
  4.     <Id>1</Id>
  5.     <Name>Shaun Deeb</Name>
  6.     <PokerStars>shaundeeb</PokerStars>
  7.     <FullTiltPoker>tedsfishfry</FullTiltPoker>
  8.     <LinkPF>http://www.pocketfives.com/profiles/shaundeeb</LinkPF>
  9.  </Person>
  10.  <Person>
  11.     <Id>2</Id>
  12.     <Name>Chris Moorman</Name>
  13.     <PokerStars>Moorman1</PokerStars>
  14.     <FullTiltPoker>MoormanI</FullTiltPoker>
  15.     <LinkPF>http://www.pocketfives.com/profiles/moorman1</LinkPF>
  16.  </Person>
  17.  <Person>
  18.     <Id>3</Id>
  19.     <Name>David Sands</Name>
  20.     <PokerStars>SexSeen</PokerStars>
  21.     <FullTiltPoker>Doc Sands</FullTiltPoker>
  22.     <LinkPF>http://www.pocketfives.com/profiles/Doc+Sands</LinkPF>
  23.   </Person>
  24. </Persons>
* This source code was highlighted with Source Code Highlighter.

Общий вид нашей программы будет примерно такой:

Скриншот программы

В первую очередь осуществляем привязку файла PokerPersons.xml и нашей основной сетки

  1. <Grid.DataContext>
  2.     <XmlDataProvider x:Name="PersonsData" Source="PokerPersons.xml" Path="Persons/Person" />
  3. </Grid.DataContext>
* This source code was highlighted with Source Code Highlighter.

Дальше, мы должны осуществить привязку нашего ListBox. Так как ListBox находится внутри Grid, то привязанные данные наследуются, поэтому мы должны просто указать свойство ItemSource у нашего ListBox.

  1.       <ListBox x:Name="PersonListBox" Margin="0,0,0,20" DockPanel.Dock="Left"
  2.          ItemsSource="{Binding}"
  3.          ItemTemplate="{StaticResource PersonsItemTemplate}"
  4.          IsSynchronizedWithCurrentItem="True"
  5.          >
  6.       </ListBox>
* This source code was highlighted with Source Code Highlighter.

Тут, есть важный момент, что если не создать PersonsItemTemplate, а это мы делаем в самом начале XAML файла в разделе Window.Resources вот, так:

  1.   <Window.Resources>
  2.     <DataTemplate x:Key = "PersonsItemTemplate">
  3.       <Label Content="{Binding XPath=Name}"/>
  4.     </DataTemplate>
  5.   </Window.Resources>
* This source code was highlighted with Source Code Highlighter.
то, в ListBox будут выводиться все данные о игроке, причем в очень некрасивой форме.
Теперь привяжем данные к
TextBox:
  1.       <StackPanel Orientation="Horizontal">
  2.         <Label Style="{StaticResource labelStyle}">Id:</Label>
  3.         <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=Id}" />
  4.       </StackPanel>
  5.       <StackPanel Orientation="Horizontal">
  6.         <Label Style="{StaticResource labelStyle}">Имя:</Label>
  7.         <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=Name}" />
  8.       </StackPanel>
  9.       <StackPanel Orientation="Horizontal">
  10.         <Label Style="{StaticResource labelStyle}">PokerStars Ник:</Label>
  11.         <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=PokerStars}" />
  12.       </StackPanel>
  13.       <StackPanel Orientation="Horizontal">
  14.         <Label Style="{StaticResource labelStyle}">FullTiltPoker Ник:</Label>
  15.         <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=FullTiltPoker}" />
  16.       </StackPanel>
* This source code was highlighted with Source Code Highlighter.

Чтобы это всё красиво выглядело я создал стили для Label назвал его labelStyle и для TextBox назвал его textboxStyle. Они помещаются в самом начале XAML файла в разделе Window.Resources, в итоге раздел выглядит так:

  1.   <Window.Resources>
  2.     <!-- Стиль для Label -->
  3.     <Style x:Key="labelStyle" TargetType="{x:Type Label}">
  4.       <Setter Property="VerticalAlignment" Value="Top" />
  5.       <Setter Property="HorizontalAlignment" Value="Right" />
  6.       <Setter Property="FontWeight" Value="Bold" />
  7.       <Setter Property="MinWidth" Value="80" />
  8.     </Style>
  9.     <!-- Стиль для TextBox -->
  10.     <Style x:Key="textboxStyle" TargetType="{x:Type TextBox}">
  11.       <Setter Property="Width" Value="200"></Setter>
  12.       <Setter Property="Margin" Value="0,0,0,0" />
  13.     </Style>
  14.     <!-- Стиль для CtackPanel -->
  15.     <Style x:Key="fieldsetStyle" TargetType="{x:Type StackPanel}">
  16.       <Setter Property="Margin" Value="0,3,0,3" />
  17.     </Style>
  18.  
  19.     <DataTemplate x:Key = "PersonsItemTemplate">
  20.       <Label Content="{Binding XPath=Name}"/>
  21.     </DataTemplate>
  22.   </Window.Resources>
* This source code was highlighted with Source Code Highlighter.

Вот и все, однонаправленное связывание готово. Скачать исходный код программы.

Теперь мы можем делать изменения в данных, но они будут сохраняться только в памяти и при каждом новом запуске программы всё будет по стараму. Попробуем это исправить.
Вначале, сделаем так, чтобы наш файл с данными
XML попадал в дерикторию с исполняемым файлом. Для этого щелкаем на самом файле и в его Properties в строчке Copy to Output Directory выбираем "Copy if newer", а в строчке Build Action выбираем Content.
Добавляем код, чтобы при загрузке данные считывались из файла, а по нажатию на кнопку "Сохранить" будем вызывать событие сохранения всех данных в файл.
  1. namespace ExampleXMLBinding
  2. {
  3.   /// <summary>
  4.   /// Interaction logic for Window1.xaml
  5.   /// </summary>
  6.   public partial class Window1 : Window
  7.   {
  8.     public Window1()
  9.     {
  10.       InitializeComponent();
  11.       string appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
  12.       PersonsData.Source = new Uri(appPath + @"\PokerPersons.xml");
  13.     }
  14.  
  15.     private void SavePersonsButton_Click(object sender, RoutedEventArgs e)
  16.     {
  17.       string source = PersonsData.Source.LocalPath;
  18.       PersonsData.Document.Save(source);
  19.     }
  20.   }
  21. }
* This source code was highlighted with Source Code Highlighter.

Скачать окончательную редакцию.

По материалам статьи http://www.codeproject.com/KB/WPF/WpfXml2WayDataBinding.aspx



Главная | Программирование | Покер | Фотография | Разное
© Андрей Семёнов, 2009
Hosted by uCoz