質問

サーバーから 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 に動的にバインドする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top