Supponiamo di avere un file XML molto semplice, del tipo:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <books>
3 <book id="1">
4 <title>Introducing To Microsoft LINQ</title>
5 <isbn>43554354523</isbn>
6 </book>
7 <book id="2">
8 <title>Pro WPF Windows Presentation Foundation in dot NET 3.0</title>
9 <isbn>232132142</isbn>
10 </book>
11 <book id="3">
12 <title>Foundations of F#</title>
13 <isbn>772337271</isbn>
14 </book>
15 <book id="4">
16 <title>Algorithms In Bioinformatics</title>
17 <isbn>12345678</isbn>
18 </book>
19 </books>
Vogliamo mostrare il contenuto del documento XML in un controllo WPF ListView o ListBox. Per effettuare il binding con i dati XML, WPF mette a disposizione degli sviluppatori la classe XmlDataProvider, la quale permette d'impostare in modo rapido e semplice l'uso di elementi XML come binding source per i controlli delle nostre applicazioni. Trattando nell'esempio un'applicazione WPF Windows Form, nel dizionario delle risorse della Window, aggiungiamo un'istanza della classe XmlDataProvider, specificando la chiave (key) d'identificazione all'interno della collezione, il Source, ovvero il percorso del file XML contenente i dati e l'espressione XPath da utilizzare per il recupero dei nodi interessati.
1 <Window.Resources>
2 <XmlDataProvider x:Key="BooksProvider" Source="Data.xml" XPath="./books/book" />
3 </Window.Resources>
Per visualizzare i dati in un ListView, nel codice XAML possiamo scrivere:
1 <ListView Margin="12,45,12,117" Name="listView1" DataContext="{StaticResource BooksProvider}" ItemsSource="{Binding}"
2 SelectionChanged="listView1_SelectionChanged" MouseDoubleClick="listView1_MouseDoubleClick">
3 <ListView.View >
4 <GridView>
5 <GridViewColumn Header="ID" Width="50" DisplayMemberBinding="{Binding XPath=@id}" ></GridViewColumn>
6 <GridViewColumn Header="Title" Width="250" DisplayMemberBinding="{Binding XPath=title}"></GridViewColumn>
7 <GridViewColumn Header="ISBN" Width="150" DisplayMemberBinding="{Binding XPath=isbn}">
8 </GridViewColumn>
9 </GridView>
10 </ListView.View>
11 </ListView>
Notiamo come la proprietà DataContext del ListView sia impostata sull'istanza del XmlDataProvider dichiarata nelle risorse,e per il binding, invece di utilizzare la proprietà Path, andiamo ad utilizzare la proprietà XPath, anteponendo in caso di attributi, il carattere @.
Se invece di utilizzare un controllo ListView, volessimo presentare i dati utilizzando un ListBox, il codice XAML da scrivere potrebbe essere simile al seguente:
1 <ListBox Margin="12,0,12,25" Name="listBox1" DataContext="{StaticResource BooksProvider}"
2 ItemsSource="{Binding}" Height="76" VerticalAlignment="Bottom">
3 <ListBox.ItemTemplate>
4 <DataTemplate >
5 <StackPanel Orientation="Horizontal">
6 <TextBlock Text="{Binding XPath=@id}"> -
7 <TextBlock Text="{Binding XPath=title}"></TextBlock>
8 </TextBlock>
9 </StackPanel>
10 </DataTemplate>
11 </ListBox.ItemTemplate>
12 </ListBox>
Nel caso in cui volessimo associare del codice sull'evento Double-Click del ListView per ottenere informazioni sul nodo correttamente selezionato, come suggerito da Giuseppe Lippolis, possiamo scrivere nel codice XAML:
1 <ListView Margin="12,45,12,117" Name="listView1" DataContext="{StaticResource BooksProvider}" ItemsSource="{Binding}" ListViewItem.MouseDoubleClick="Item_MouseDoubleClick">
2 ....
3 </ListView >
Nel code-behind:
1 private void Item_MouseDoubleClick(object sender, MouseButtonEventArgs e)
2 {
3 ListView lsv = (ListView)e.Source;
4 XmlElement book = (XmlElement)lsv.SelectedItem;
5 string message = String.Format("Double Click: {0} - {1} - {2}",
6 book.GetAttribute("id"), book["title"].InnerText,
7 book["isbn"].InnerText);
8 MessageBox.Show(message);
9 }