2009-03-09 13 views
1

Ich habe eine App, die XML von einem Server empfängt. Ich möchte die Daten an ein Datenraster binden und es wäre ärgerlich, wenn das Raster die Spalten automatisch generiert. Bisher habe ich in meinem Code so viel versucht.So binden Sie XML an ein DataGrid in Silverlight

XAML Seite:

<data:DataGrid x:Name="Status" ItemsSource="{Binding}" AutoGenerateColumns="True"> 
</data:DataGrid> 

-Code hinter der Seite:

void Status_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    XElement recordSet = XElement.Load(e.Result); 
    CamerasStatusTabDataGrid.ItemsSource = recordSet.Elements("Status"); 
} 

XML vom Server:

<StatusReport> 
    <Status Description="Spilled Coffe on Server" Date="2/5/2009" /> 
    <Status Description="Mice in Copier" Date="4/3/2008" /> 
    <Status Description="Helped User Find Any Key" Date="6/2/2008" /> 
</StatusReport> 

Was ich suche ist zu tun, um den Status haben eine Zeile im Raster sein, wobei "Description" und "Date" Spalten sind.

+0

Ich habe meine ursprüngliche Post aktualisiert. Es funktionierte auf meiner Maschine. :-) – Klinger

+0

Funktioniert der Code für Sie? Es funktioniert nicht für mich. –

Antwort

4

Ein guter Weg, dies zu tun, ist mit Linq zu Xml, die folgende ist ein vollständiges Beispiel:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    Width="400" Height="300" 
    Loaded="Page_Loaded"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <data:DataGrid x:Name="DataGrid1" /> 
    </Grid> 
</UserControl> 

Page.xaml.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
using System.Xml.Linq; 

namespace SilverlightApplication1 
{ 
    public partial class Page : UserControl 
    { 
     public Page() 
     { 
      InitializeComponent(); 
     } 

     private void Page_Loaded(object sender, RoutedEventArgs e) 
     { 
      DataGrid1.ItemsSource = GetStatusReport(); 
     } 

     public List<Status> GetStatusReport() 
     { 
      List<Status> statusReport = new List<Status>(); 

      // Get your Xml using XElement.Load(e.Result); 
      XElement doc = XElement.Load(@"Data/StatusReport.xml"); 

      statusReport = (from el in doc.Elements() 
          select GetStatus(el)).ToList(); 

      return statusReport; 
     } 

     private Status GetStatus(XElement el) 
     { 
      Status s = new Status(); 
      s.Description = el.Attribute("Description").Value; 
      s.Date = DateTime.Parse(el.Attribute("Date").Value); 
      return s; 
     } 
    } 
} 

Stellen Sie sicher ein dd ein Verweis auf die System.Xml.Linq-Assembly. Dies erzeugt die von Ihnen gesuchte Ausgabe mit einem Status für jede Zeile im Gitter mit "Beschreibung" und "Datum" als Spalten.

alt text http://www.freeimagehosting.net/uploads/aa3f9978fc.png

+0

Es funktioniert. Nicht dynamisch, aber es funktioniert! – QueueHammer

0

Bitte beachten Sie die folgenden link.

Es enthält laufenden Code (in meiner Umgebung), der zur Laufzeit eine Klasse mit den Eigenschaften erstellt. Die Klasse wird zum Füllen eines generischen IList <-Objekts > verwendet, das als Quelle für das Datagrid dienen kann.

Ich fühlte mich nicht komfortabel den Code hier, weil 99.99999% davon ist nicht meins.

Der Link führt Sie zum ursprünglichen Beitrag, wo Sie die Silverlight Code als Kommentar von mir geschrieben finden.

posted ich einen anderen Ansatz vor einer Weile einen Wert Konverter: Dynamically Bind XML to DataGrid in Silverlight

+0

Dies ist ein gutes Tutorial. Ich suche jedoch nach einer Möglichkeit, die Daten dynamisch zu binden, da ich die Namen aller Spalten nicht kennen kann. – QueueHammer

Verwandte Themen