2011-07-23 14 views
0

私のプロジェクトのデータベースとして使用するXMLファイルがあります。これは、XMLファイルです。WPF DataGridにXMLを正しくバインドする(ラウンド2)実行時に新しいDataGridを作成する

http://pastebin.com/JgyYkn4E

私はこの質問を発見し、それをしようと試み: How to bind xml to the WPF DataGrid correctly?

私は別に各 Semestre、各データグリッド内の1の Cadeirasを表示したいです。

XElement db = XElement.Load("db.xml"); 
var cadeira = from elem in db.Descendants("Semestre") 
       where elem.Element("Nome").Value == "Semestre 1" 
       select elem.Element("Cadeiras"); 
dataGrid1.DataContext = cadeira; 

最初の質問:いくつかの時間を過ごした後、私はそれがこれでXElementオブジェクトを照会作業を置くために管理し、私のプロジェクトに合わせて、いくつかの未成年者のものを変更したが、それは働いていなかった。これは、働いていたが、私はちょうどかどうかを知りたいですこのDataGridはTabContem(TabControlの中にあります)の中にあるので、後で実行時に、それぞれのSemestreのCadeirasでDataGridを使って新しいTabItem(各Semestreに対して)を作成しなければならないので、 XAMLバインディングを使用しないでください。

第2の質問:XAMLでは、How to bind xml to the WPF DataGrid correctly?のようなバインディングと、WPF Datagrid binding to xmlというバインディングの違いは何ですか?

ありがとうございます。

敬具、

-N

答えて

0

あなたはdata templating経由たくさんを行うことができ、XAMLパーサー(Kaxamlのような)でこの例を試してみてください。

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Page.Resources> 
    <XmlDataProvider x:Key="data" XPath="GPA/Semestre" Source="http://pastebin.com/raw.php?i=JgyYkn4E"/> 
    </Page.Resources> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <TabControl ItemsSource="{Binding Source={StaticResource data}}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding XPath=Nome}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataGrid ItemsSource="{Binding XPath=Cadeiras/Cadeira}" AutoGenerateColumns="False"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Activa" Binding="{Binding XPath=Activa}"/> 
         <DataGridTextColumn Header="Nome" Binding="{Binding XPath=Nome}"/> 
         <DataGridTextColumn Header="Nota" Binding="{Binding XPath=Nota}"/> 
        </DataGrid.Columns> 
       </DataGrid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
     </TabControl> 
    </ScrollViewer> 
</Page> 

これが作成されます。 TabControlとすべてのDataGridを使用できます。

(あなたのサンプルでCadeirasは非常に複雑で見ていないので、それらのそれぞれが作成することにより、同様にあなたがCadeiraごとに1つのDataGridが必要な場合は、それを行うことができ、データグリッドで1行のみです ItemsControlその ItemTemplateDataGridです)

これらの質問の方法の違いは、XMLを表すために異なるクラスを使用することです。通常、XElementは使用しません。これは、バインディングにXPathをサポートしないためです。

LINQ to XMLオブジェクトXDocumentおよびXElementはXPathを使用しません。詳細については、How to: Bind to XDocument, XElement, or LINQ for XML Query Results.


を参照してくださいがあり、これを行うための正しい方法は何も本質的ではありませんが、XmlDataProvidersので、XmlDocumentsのための天然の結合のサポートがあるので、私がいないと重大な理由がない限り、私はそれで行くだろう。

+0

うわー!まず第一に、XAMLを使ってこのすべてを行うことができないことを知っていませんでした。驚くべきことに、XMLから何かを読むことは、あなたが多くの方法を持っていて、ために。 – vvolkgang

+0

これはあなたの質問に答えましたか? (もしそうなら、あなたは[それを受け入れる]ことができます(http://meta.stackexchange。あなたが何が欠けていると私は精緻化することができるかもしれないと教えてください) –

+0

(申し訳ありませんが、私は私の最後を編集しようとしました投稿、いくつかの問題がある、これは残りの部分です) たとえば、XElementを使用する代わりにXPathをサポートするオブジェクトを使用する最大の理由は何ですか? 投稿したxamlについて、私はdataGridにもっと多くのデータを挿入できるようにしたいのですが、常に "..."で新しい行を作成するのではなく "通常の"方法があるので、そこに、彼はその行に何かを追加することができます(そして、 "..."という新しい行が作成されます)? – vvolkgang

関連する問題