2010-10-22 63 views
2

我对Silverlight完全陌生,并试图以“正确的方式”做事。将任意XML绑定到数据网格

问题是:我有一个XML需要从Web服务器获取,我需要在数据网格中显示该数据。

我已搜索周围,我已经成功地得到如下:

说我的XML看起来像:

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

我可以检索这并填充POCO如:

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 2010-10-22 19:55:47

回答

2

看看使用XMLSerializerDeserialize方法来自动反序列化您的XML而不必处理XDocument。您的类将是这样的:

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

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

} 

一旦你的数据解串,采取怎样的数据正确地绑定到你的观点看看MVVM

+0

+1:用于反序列化。 – AnthonyWJones 2010-10-22 20:00:32

+0

但是,为Customer类执行上述操作并不会“自动”为您提供IEnumerable 。 – iggymoran 2010-10-25 12:21:05

+0

是的,当然,您需要经过几个步骤:创建序列化程序并传递数据源以反序列化。但是,这是一种更可维护的方式,因为添加或删除属性或者甚至整个类都不需要更新反序列化代码,只需要类和属性即可。我会尽量在后面添加一些更详细的答案,以使这个更清晰。 – Murven 2010-10-25 13:10:11