如何在Silverlight中将XML绑定到数据网格

如何在Silverlight中将XML绑定到数据网格,silverlight,data-binding,datagrid,Silverlight,Data Binding,Datagrid,我有一个从服务器接收XML的应用程序。我想将数据绑定到一个数据网格,如果网格自动生成列,那么它将是一个网格。到目前为止,我已经在代码中尝试了这么多 XAML页面: <data:DataGrid x:Name="Status" ItemsSource="{Binding}" AutoGenerateColumns="True"> </data:DataGrid> 来自服务器的XML: <StatusReport> <Status Descript

我有一个从服务器接收XML的应用程序。我想将数据绑定到一个数据网格,如果网格自动生成列,那么它将是一个网格。到目前为止,我已经在代码中尝试了这么多

XAML页面:

<data:DataGrid x:Name="Status" ItemsSource="{Binding}" AutoGenerateColumns="True">
</data:DataGrid>
来自服务器的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>


我想做的是将状态设置为网格中的一行,“Description”和“Date”列。

请查看以下内容

它包含(在我的环境中)创建具有属性的类的运行代码 在运行时。 该类用于填充一个通用IList,该IList可以 作为数据网格的源

我觉得在这里发布代码很不舒服,因为99.99999%的代码都不是 我的

这些链接将带您进入原始帖子,您将发现Silverlight正在工作 代码作为我发布的评论


不久前,我发布了另一种使用值转换器的方法:

请查看以下内容

它包含(在我的环境中)创建具有属性的类的运行代码 在运行时。 该类用于填充一个通用IList,该IList可以 作为数据网格的源

我觉得在这里发布代码很不舒服,因为99.99999%的代码都不是 我的

这些链接将带您进入原始帖子,您将发现Silverlight正在工作 代码作为我发布的评论


不久前我发布了另一种使用值转换器的方法:

一种很好的方法是使用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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Windows;
使用System.Windows.Controls;
使用System.Xml.Linq;
命名空间SilverlightApplication1
{
公共部分类页面:UserControl
{
公共网页()
{
初始化组件();
}
已加载私有无效页面(对象发送方,路由目标e)
{
DataGrid1.ItemsSource=GetStatusReport();
}
公共列表GetStatusReport()
{
列表状态报告=新列表();
//使用XElement.Load(e.Result)获取Xml;
XElement doc=XElement.Load(@“Data/StatusReport.xml”);
statusReport=(来自doc.Elements()中的el)
选择GetStatus(el)).ToList();
返回状态报告;
}
私有状态GetStatus(XElement el)
{
状态s=新状态();
s、 描述=el.属性(“描述”).值;
s、 Date=DateTime.Parse(el.Attribute(“Date”).Value);
返回s;
}
}
}
确保添加对System.Xml.Linq程序集的引用。这将生成您正在查找的输出,其中网格中每一行的状态都以“Description”和“Date”作为列


一个很好的方法是使用Linq to 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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Windows;
使用System.Windows.Controls;
使用System.Xml.Linq;
命名空间SilverlightApplication1
{
公共部分类页面:UserControl
{
公共网页()
{
初始化组件();
}
已加载私有无效页面(对象发送方,路由目标e)
{
DataGrid1.ItemsSource=GetStatusReport();
}
公共列表GetStatusReport()
{
列表状态报告=新列表();
//使用XElement.Load(e.Result)获取Xml;
XElement doc=XElement.Load(@“Data/StatusReport.xml”);
statusReport=(来自doc.Elements()中的el)
选择GetStatus(el)).ToList();
返回状态报告;
}
私有状态GetStatus(XElement el)
{
状态s=新状态();
s、 描述=el.属性(“描述”).值;
s、 Date=DateTime.Parse(el.Attribute(“Date”).Value);
返回s;
}
}
}
确保添加对System.Xml.Linq程序集的引用。这将生成您正在查找的输出,其中网格中每一行的状态都以“Description”和“Date”作为列


这是一个很好的教程。但是,我正在寻找一种动态绑定数据的方法,因为我可能不知道所有列的名称。这是一个很好的教程。然而,我正在寻找一种动态绑定数据的方法,因为我可能不知道所有列的名称。我已经更新了我的原始帖子。它在我的机器上工作。:-)代码对你有用吗。这对我不起作用。我已经更新了我原来的帖子。它在我的机器上工作。:-)代码对你有用吗。这对我不起作用。