如何在Silverlight中将XML绑定到数据网格
我有一个从服务器接收XML的应用程序。我想将数据绑定到一个数据网格,如果网格自动生成列,那么它将是一个网格。到目前为止,我已经在代码中尝试了这么多 XAML页面:如何在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
<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”作为列
这是一个很好的教程。但是,我正在寻找一种动态绑定数据的方法,因为我可能不知道所有列的名称。这是一个很好的教程。然而,我正在寻找一种动态绑定数据的方法,因为我可能不知道所有列的名称。我已经更新了我的原始帖子。它在我的机器上工作。:-)代码对你有用吗。这对我不起作用。我已经更新了我原来的帖子。它在我的机器上工作。:-)代码对你有用吗。这对我不起作用。