title: Bind a Silverlight Datagrid to Excel XML FIle
body: <p>I am trying to pull the data from an Excel File that has been saved as XML and bind it to a Silverlight DataGrid. I am following a tutorial that I found on the web, but I cannot get the desired results.</p>
  
  <pre><code>using System;
  using System.Windows;
  using System.Windows.Controls;
  using System.Windows.Documents;
  using System.Windows.Ink;
  using System.Windows.Input;
  using System.Windows.Media;
  using System.Windows.Media.Animation;
  using System.Windows.Shapes;
  using System.Xml.Linq;
  using System.Linq;
  using System.IO;
  using System.Collections.Generic;
  using System.Windows.Data;
  using System.Collections.ObjectModel;
  
  namespace AmicusToApexImporter
  {
      public partial class MainPage : UserControl
      {
  
          static ObservableCollection&lt;List&lt;string&gt;&gt; items = new ObservableCollection&lt;List&lt;string&gt;&gt;();
  
          public MainPage()
          {
              // Required to initialize variables
              InitializeComponent();
          }
  
          private void ImportXMLFIle()
          {
  
              var doc = XDocument.Parse(ReadUserXMLFile());
  
              PopulateExcelDataToDataGrid(doc);
  
              SetupDataGridFromSpreadsheetColumnNames(doc);
  
          }
  
          private string ReadUserXMLFile()
          {
              OpenFileDialog dlg = new OpenFileDialog();
              dlg.Multiselect = false;
              dlg.Filter = "Excel XML Files (*.xml)|*.xml";
              bool bResult = (bool)dlg.ShowDialog();
              if (!bResult)
                  return "";
  
              FileInfo info = dlg.File;
              StatusText.Text = info.Name;
  
              // open the stream for reading
  
              Stream s = info.OpenRead();
  
              StreamReader reader = new StreamReader(s);
  
              var xml = reader.ReadToEnd();
              return xml;
          }
  
          private void SetupDataGridFromSpreadsheetColumnNames(XDocument doc)
          {
              // get a list of column names
              var columnNames = doc.Descendants().Where(x =&gt; x.Name.LocalName == "Row").First().Descendants().Where(y =&gt; y.Name.LocalName == "Data").Select(q =&gt; q.Value).ToList();
  
              int count = 0;
              // create the columns in the datagrid and set the bindings to use
              // a value converter that can process the array of strings
              foreach (var name in columnNames)
              {
                  var column = new DataGridTextColumn() { Header = name };
                  dataGrid1.Columns.Add(column);
                  column.Binding = new Binding() { Converter = (IValueConverter)this.Resources["arrayIndexToValueConverter"], ConverterParameter = count };
                  count++;
              }
              // set the data source of the data grid
              dataGrid1.ItemsSource = items;
          }
  
          private static void PopulateExcelDataToDataGrid(XDocument doc)
          {
              var rows = doc.Descendants().Where(x =&gt; x.Name.LocalName == "Row");
  
              int rowCount = 0;
              foreach (var row in rows)
              {
                  // skip the data in the first row since it is the header
                  if (rowCount &gt; 0)
                  {
                      var data = row.Descendants().Where(y =&gt; y.Name.LocalName == "Data").Select(q =&gt; q.Value).ToList();
                      items.Add(data);
                  }
  
                  rowCount++;
              }
          }
  
          private void btnGo_Click(object sender, System.Windows.RoutedEventArgs e)
          {
              ImportXMLFIle();
          }
  
  
      }
  
      public class ArrayIndexToValueConverter : IValueConverter
      {
  
          #region IValueConverter Members
  
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              var index = (int)parameter;
              var list = value as List&lt;string&gt;;
              if (index &gt;= list.Count) return "";
              return list[index];
          }
  
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              throw new NotImplementedException();
          }
  
          #endregion
      }
  
  }
  </code></pre>
  
  <p>All of the fields in the Datagrid are populated with "system.collections.generic.list 1 system.string" and three other addition Columns are added to the Grid - Capacity, Count, Item.</p>
  
  <p>What am I doing wrong? Thanks.</p>