2010-10-22 4 views
2

Я совершенно новый в silverlight и стараюсь делать «правильный путь».Связывание произвольного XML с datagrid

Проблема: у меня есть XML, который мне нужно получить с веб-сервера, и мне нужно отобразить эти данные в datagrid.

Я искал вокруг, и я сумел получить следующее:

сказать, что мой XML выглядит следующим образом:

<customers> 
    <customer> 
     <name>A Person</name> 
     <address>my address</address> 
    </customer> 
    <customer> 
     <name>A Guy</name> 
     <address>my address 2</address> 
    </customer> 
</customers> 

я могу получить это и заполнить ПОКО, такие как:

public class Customer 
{ 
    public string Name { get; set; } 

    public string Address { get; set; } 
} 
... 
XDocument oDoc = //read from a string asnychronously 
var myData = from info in oDoc.Descendants("customer") 
    select new Customer 
    { 
     Name = Convert.ToString(info.Element("name").Value), 
     Address = Convert.ToString(info.Element("address").Value 
    }; 
_grid.ItemsSource = myData; 

Однако, если я возьму этот подход, я не буду использовать возможности динамического связывания Silverlight.

Как я могу это сделать в режиме «Silverlight», так что, когда я (или кто-то другой, кто действительно знает Silverlight), посмотрите на код через несколько лет после этой строки, не ненавидите абсолютно ненавижу то, что я сделал ,

+0

Я не уверен, что вы думаете о «динамическом привязке», но Silverlight в значительной степени полагается на отражение типов для привязки. Следовательно, для того, чтобы Silverlight мог эффективно связываться, вам нужен такой тип, как ваш объект Customer. – AnthonyWJones

ответ

2

Взгляните на использование XMLSerializer. Deserialize метод де-сериализации вашего XML автоматически без необходимости иметь дело с XDocument. Ваш класс будет выглядеть следующим образом:

[XmlRoot] 
public class Customer 
{ 
    [XmlElement] 
    public string Name { get; set; } 

    [XmlElement] 
    public string Address { get; set; } 

} 

После того, как у вас есть данные десериализуются, посмотрите на MVVM о том, как правильно связать данные с представлениями.

+0

+1: для десериализации. – AnthonyWJones

+0

Однако выполнение вышеуказанного для класса Customer не «автоматически» дает вам IEnumerable . – iggymoran

+0

Да, конечно, есть несколько шагов, которые вам нужно пройти: Создайте сериализатор и передайте источник данных для де-сериализации. Однако это более удобный способ сделать это, поскольку добавление или удаление свойств или даже целых классов не требует обновления кода де-сериализации, а именно классов и атрибутов. Я попытаюсь добавить более подробно к ответу позже, чтобы сделать это более ясным. – Murven