2009-03-09 5 views
1

У меня есть приложение, которое получает XML с сервера. Я хочу привязать данные к сетке данных, и будет решена, если сетка автоматически создаст столбцы. До сих пор я очень старался в своем коде.Как связать XML с DataGrid в Silverlight

XAML страницы:

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

код позади на странице:

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

XML с сервера:

<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> 

То, что я ищу, чтобы сделать это, чтобы иметь статус быть строкой в ​​сетке с столбцами «Описание» и «Дата».

+0

Я обновил мой оригинальный пост. Он работал на моей машине. :-) – Klinger

+0

Работает ли код для вас. Это не работает для меня. –

ответ

4

Хороший способ сделать это с помощью Linq в Xml, следующий полный пример:

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; 
     } 
    } 
} 

Убедитесь, что вы dd ссылку на сборку System.Xml.Linq. Это дает результат, который вы искали, с статусом для каждой строки в сетке с «Описание» и «Дата» в виде столбцов.

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

+0

Это работает. Не динамический, но он работает! – QueueHammer

0

Обратите внимание на следующие link.

Он содержит текущий код (в моей среде), который создает класс со свойствами во время выполнения. Класс используется для заполнения общего объекта IList < >, который может служить в качестве источника для данных.

Я не чувствовал себя комфортно, размещая здесь код, потому что 99.99999% его не мой.

Ссылки доставят вас к исходному сообщению, где вы найдете Silverlight working код как комментарий, отправленный мной.

я отправил другой подход некоторое время назад с помощью преобразователя значения: Dynamically Bind XML to DataGrid in Silverlight

+0

Это хороший учебник. Тем не менее, я ищу способ связать данные динамически, так как я не могу знать имена всех столбцов. – QueueHammer