Silverlight で XML を DataGrid にバインドする方法
-
06-07-2019 - |
質問
サーバーから XML を受信するアプリがあります。データをデータ グリッドにバインドしたいのですが、グリッドが列を自動生成すると大変なことになります。これまでのところ、コードでこれだけのことを試みてきました。
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>
私がやろうとしているのは、ステータスをグリッド内の行にし、「説明」と「日付」を列にすることです。
解決
これを行う良い方法は、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.Xml.Linqアセンブリへの参照を必ず追加してください。これにより、グリッド内のすべての行のステータスが<!> quot; Description <!> quot;で、探していた出力が生成されます。および<!> quot; Date <!> quot;列として。
代替テキストhttp://www.freeimagehosting.net/uploads/aa3f9978fc.png
他のヒント
スミス、
あなたが言及したのと同様の要件がありました。ソリューションに関するコードプロジェクトの記事を投稿しました。 http://www.codeproject.com/KB/silverlight/SilverlightDGFromMDB.aspx
これが役立つことを願っています。
ありがとう R.アラスエランゴ
以下をご覧ください リンク.
実行時にプロパティを備えたクラスを作成する実行コード(私の環境)が含まれています。クラスは、一般的なイリストの居住に使用されますu003Cobject>これは、Datagridのソースとして機能します。
99.99999%が私のものではないため、ここにコードを投稿するのは快適ではありませんでした。
リンクは、Silverlightが動作している元の投稿に移動します。 のコードは、私が投稿したコメントである。
私は少し前に、値コンバーターを使用した別のアプローチを投稿しました。 Silverlight で XML を DataGrid に動的にバインドする