2011-07-23 18 views
0

我有一個XML文件,我將用作我的項目的數據庫,這是我擁有的xml文件:正確地將XML綁定到WPF DataGrid(第2輪)並在運行時創建新的DataGrid

http://pastebin.com/JgyYkn4E

我發現這個問題,並tryed它: How to bind xml to the WPF DataGrid correctly?

我要顯示的每個 Semestre Cadeiras,分開,各有一個DataGrid中。改變了一些未成年人的東西適合我的項目,但它沒有工作,花費幾個小時後,我準備將它的工作與此查詢的XElement:

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; 

第一個問題:這個工作,但我只是想知道,如果這是最好的事情,因爲這個DataGrid是在一個TabItem(它在一個TabControl中),後來我將不得不在創建新的TabItems(對於每個Semestre,其中有一個DataGrid,裏面有相應的Semestre的Cadeiras)沒有XAML約束力的幫助。

第二個問題:在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和所有的DataGrids給你。 (在你的樣品Cadeiras看起來不很複雜,所以他們每個人都只是一個排在DataGrid,如果你需要每Cadeira一個DataGrid中,你可以做到這一點,以及通過創建ItemsControlItemTemplateDataGrid


這些問題中的方法之間的區別在於它們使用不同的類來表示XML,通常不會使用XElement,因爲在綁定中不支持XPath

LINQ到XML對象XDocumentXElement不使用XPath。有關詳細信息,請參閱How to: Bind to XDocument, XElement, or LINQ for XML Query Results.


沒有本質上做到這一點正確的方法,但由於存在對XmlDataProviders機綁定的支持,因此XmlDocuments我會與去,除非我有一個顯著的理由。

+0

哇!首先,我不知道使用XAML可以做到所有這些,令人驚訝的是,從XML中讀取某些東西的事情是,你有很多方法,沒有地方可以通過它們有用的東西來解釋對於。 – vvolkgang

+0

那麼這是否回答你的問題? (如果是的話,你可以[接受它](http://meta.stackexchange。如果不是,請告訴我你的想法是否缺失,我可能會詳細說明) –

+0

(對不起,但是,我試着編輯我的最後一頁後,得到一些問題,這是其餘的部分) 使用支持XPath而不是XElement的對象的最大原因是什麼? 關於您發佈的xaml,我希望能夠在dataGrid中插入更多數據,是否有一種「正常」的方式,而不是始終創建一個帶有「...」的新行,因此每次用戶點擊在那裏,他可以添加一些東西到該行(並創建一個新的行「...」)? – vvolkgang