Напишем пример программы, которая будет состоять из приложения WPF с одним окном и XML файл, который будет содержать используемы данные. Я являюсь поклонником спортивного покера, поэтому пример данных файл PokerPersons.xml будет представлять из себя реальное имя человека и ники на сайтах PokerStars и FullTiltPoker.
- <?xml version="1.0" encoding="utf-8" ?>
- <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <Person>
- <Id>1</Id>
- <Name>Shaun Deeb</Name>
- <PokerStars>shaundeeb</PokerStars>
- <FullTiltPoker>tedsfishfry</FullTiltPoker>
- <LinkPF>http://www.pocketfives.com/profiles/shaundeeb</LinkPF>
- </Person>
- <Person>
- <Id>2</Id>
- <Name>Chris Moorman</Name>
- <PokerStars>Moorman1</PokerStars>
- <FullTiltPoker>MoormanI</FullTiltPoker>
- <LinkPF>http://www.pocketfives.com/profiles/moorman1</LinkPF>
- </Person>
- <Person>
- <Id>3</Id>
- <Name>David Sands</Name>
- <PokerStars>SexSeen</PokerStars>
- <FullTiltPoker>Doc Sands</FullTiltPoker>
- <LinkPF>http://www.pocketfives.com/profiles/Doc+Sands</LinkPF>
- </Person>
- </Persons>
* This source code was highlighted with Source Code Highlighter.
Общий вид нашей программы будет примерно такой:
В первую очередь осуществляем привязку файла PokerPersons.xml и нашей основной сетки
- <Grid.DataContext>
- <XmlDataProvider x:Name="PersonsData" Source="PokerPersons.xml" Path="Persons/Person" />
- </Grid.DataContext>
* This source code was highlighted with Source Code Highlighter.
Дальше, мы должны осуществить привязку нашего ListBox. Так как ListBox находится внутри Grid, то привязанные данные наследуются, поэтому мы должны просто указать свойство ItemSource у нашего ListBox.
- <ListBox x:Name="PersonListBox" Margin="0,0,0,20" DockPanel.Dock="Left"
- ItemsSource="{Binding}"
- ItemTemplate="{StaticResource PersonsItemTemplate}"
- IsSynchronizedWithCurrentItem="True"
- >
- </ListBox>
* This source code was highlighted with Source Code Highlighter.
Тут, есть важный момент, что если не создать PersonsItemTemplate, а это мы делаем в самом начале XAML файла в разделе Window.Resources вот, так:
- <Window.Resources>
- <DataTemplate x:Key = "PersonsItemTemplate">
- <Label Content="{Binding XPath=Name}"/>
- </DataTemplate>
- </Window.Resources>
* This source code was highlighted with Source Code Highlighter.
то, в ListBox будут выводиться все
данные о игроке, причем в очень некрасивой форме. - <StackPanel Orientation="Horizontal">
- <Label Style="{StaticResource labelStyle}">Id:</Label>
- <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=Id}" />
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <Label Style="{StaticResource labelStyle}">Имя:</Label>
- <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=Name}" />
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <Label Style="{StaticResource labelStyle}">PokerStars Ник:</Label>
- <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=PokerStars}" />
- </StackPanel>
- <StackPanel Orientation="Horizontal">
- <Label Style="{StaticResource labelStyle}">FullTiltPoker Ник:</Label>
- <TextBox Style="{StaticResource textboxStyle}" Text="{Binding XPath=FullTiltPoker}" />
- </StackPanel>
* This source code was highlighted with Source Code Highlighter.
Чтобы это всё красиво выглядело я создал стили для Label назвал его labelStyle и для TextBox назвал его textboxStyle. Они помещаются в самом начале XAML файла в разделе Window.Resources, в итоге раздел выглядит так:
- <Window.Resources>
- <!-- Стиль для Label -->
- <Style x:Key="labelStyle" TargetType="{x:Type Label}">
- <Setter Property="VerticalAlignment" Value="Top" />
- <Setter Property="HorizontalAlignment" Value="Right" />
- <Setter Property="FontWeight" Value="Bold" />
- <Setter Property="MinWidth" Value="80" />
- </Style>
- <!-- Стиль для TextBox -->
- <Style x:Key="textboxStyle" TargetType="{x:Type TextBox}">
- <Setter Property="Width" Value="200"></Setter>
- <Setter Property="Margin" Value="0,0,0,0" />
- </Style>
- <!-- Стиль для CtackPanel -->
- <Style x:Key="fieldsetStyle" TargetType="{x:Type StackPanel}">
- <Setter Property="Margin" Value="0,3,0,3" />
- </Style>
-
- <DataTemplate x:Key = "PersonsItemTemplate">
- <Label Content="{Binding XPath=Name}"/>
- </DataTemplate>
- </Window.Resources>
* This source code was highlighted with Source Code Highlighter.
Вот и все, однонаправленное связывание готово. Скачать исходный код программы.
Теперь мы можем делать изменения в данных, но они будут сохраняться только в памяти и при каждом новом запуске программы всё будет по стараму. Попробуем это исправить.- namespace ExampleXMLBinding
- {
- /// <summary>
- /// Interaction logic for Window1.xaml
- /// </summary>
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- string appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
- PersonsData.Source = new Uri(appPath + @"\PokerPersons.xml");
- }
-
- private void SavePersonsButton_Click(object sender, RoutedEventArgs e)
- {
- string source = PersonsData.Source.LocalPath;
- PersonsData.Document.Save(source);
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Скачать окончательную редакцию.
По материалам статьи http://www.codeproject.com/KB/WPF/WpfXml2WayDataBinding.aspx