Introduction
This example shows how to bind to XML data using an XmlDataProvider.
XmlDataProvider provides and easy and convenient way to access XML Data. It also provides convenient way to use any tree of XML nodes as a binding source.
In the below example, the XML data is incorporated as a data island in Resources section.
The promary requirement of the define data island as to have the xmlns attribute to be empty.
The below code uses a listbox to display the data coming from XML.
The code:
<Window x:Class="WindowsApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Employee Details" Height="300" Width="600"
>
<Window.Resources>
<XmlDataProvider x:Key="EmployeeListData" XPath="/EmployeeList">
<x:XData>
<EmployeeList xmlns="">
<Employee>
<Employeename>Mike</Employeename>
<Age>32</Age>
<DOJ>3/1/2002</DOJ>
<Department>Product Development</Department>
<Post>Project Manager</Post>
</Employee>
<Employee>
<Employeename>Steve</Employeename>
<Age>36</Age>
<DOJ>8/1/2001</DOJ>
<Department>Web Development</Department>
<Post>Project Lead</Post>
</Employee>
<Employee>
<Employeename>Joseph</Employeename>
<Age>24</Age>
<DOJ>5/1/2005</DOJ>
<Department>Product Development</Department>
<Post>Developer</Post>
</Employee>
<Employee>
<Employeename>Jenifer</Employeename>
<Age>28</Age>
<DOJ>2/1/2004</DOJ>
<Department>Product Development</Department>
<Post>Designer</Post>
</Employee>
<Employee>
<Employeename>Arnold</Employeename>
<Age>30</Age>
<DOJ>3/1/2002</DOJ>
<Department>Web Development</Department>
<Post>Project Manager</Post>
</Employee>
</EmployeeList>
</x:XData>
</XmlDataProvider>
<DataTemplate x:Key="EmployeeTemplate">
<Grid Block.LineHeight="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding XPath=Employeename}" Grid.Column="0"
FontSize="12" FontWeight="Bold" />
<TextBlock Text="{Binding XPath=Age}" Grid.Column="1" FontSize="12"/>
<TextBlock Grid.Column="2" Text="{Binding XPath=DOJ}" FontSize="12"/>
<TextBlock Grid.Column="3" Text="{Binding XPath=Department}" FontSize="12"/>
<TextBlock Grid.Column="4" Text="{Binding XPath=Post}" FontSize="12"/>
</Grid>
</DataTemplate>
</Window.Resources>
<StackPanel>
<TextBlock FontSize="20" FontWeight="Bold" Margin="10" FontFamily="Verdana" TextAlignment="Center">Employee Details</TextBlock>
<Grid Block.TextAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Employee Name" Grid.Column="0"
FontSize="12" FontWeight="Bold" />
<TextBlock Text="Age" Grid.Column="1"
FontSize="12" FontWeight="Bold" />
<TextBlock Text="Date of Joining" Grid.Column="2"
FontSize="12" FontWeight="Bold" />
<TextBlock Text="Department" Grid.Column="3"
FontSize="12" FontWeight="Bold" />
<TextBlock Text="Post" Grid.Column="4"
FontSize="12" FontWeight="Bold" />
</Grid>
<ListBox Name="myListBox" Height="200"
ItemsSource="{Binding Source={StaticResource EmployeeListData}, XPath=Employee}"
ItemTemplate ="{StaticResource EmployeeTemplate}"/>
</StackPanel>
</Window>
Output:

However, implementing as Data Island is not a convenient way if the data is too large.
The better way is to have a separate XML file and using it as a data source.
<XmlDataProvider x:Key=" EmployeeListData" Source="data\Empdata.xml" XPath="Employee"/>
That's it; .Net 3.0 is here to rock.