2010-02-04 84 views
7

我一直在尋找和嘗試各種解決方案,但迄今爲止沒有人解決我的問題。我在Visual Studio 2010/.NET4中使用WPF中的內置DataGrid來顯示作爲XDocument存儲的XML文檔中的數據。如何正確地將xml綁定到WPF DataGrid?

我的代碼都運行良好,我已驗證XDocument存在並且正確。但是,DataGrid不顯示任何數據。

的XML看起來像這樣(簡化爲清楚起見):

<data> 
    <track> 
    <id>211</id> 
    <name>Track Name</name> 
    <duration>156</duration> 
    <artist_id>13</artist_id> 
    <artist_name>Artist Name</artist_name> 
    <album_id>29</album_id> 
    <album_name>Album Name</album_name> 
    </track> 
... 
</data> 

我的XAML看起來像這樣:

<DataGrid x:Name="LibraryView" Grid.Row="1" 
       DataContext="{Binding Path=TrackList}" ItemsSource="{Binding XPath=/data/track}"> 
    <DataGridTextColumn Header="Title" Binding="{Binding XPath=name}"/> 
    <DataGridTextColumn Header="Artist" Binding="{Binding XPath=artist_name}"/> 
    <DataGridTextColumn Header="Album" Binding="{Binding XPath=album_name}"/> 
    <DataGridTextColumn Header="Length" Binding="{Binding XPath=duration}"/> 
</DataGrid> 

備份它只是在C#分配一個新的XDocument(從下載Web服務)到TrackList屬性(實現INotifyPropertyChanged)。沒有進一步的處理。

我以前曾嘗試使用XLinq來綁定到查詢結果,但兩者都無效(同樣的問題),所以我想我會嘗試XPath方法來避免編寫潛在的錯誤Linq語句,並嘗試找到問題。

我正在耗盡如何使DataGrid正確顯示的想法。我對這項工作應該如何工作的理解顯然是缺乏的,所以我非常感謝提供的任何幫助。

編輯:值得一提的是,我對輸入數據格式有一定的靈活性,因爲我自己下載了原始XML。我會嘗試一些建議,看看我能做些什麼。

回答

9

我用XLINQ和工作得很好,使用的XElement代替的XDocument:

XElement TrackList = XElement.Load("List.xml"); 
LibraryView.DataContext = TrackList; 

的XAML:

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[track]}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Artist" Binding="{Binding Path=Element[artist_name].Value}"/> 
     <DataGridTextColumn Header="Album" Binding="{Binding Path=Element[album_name].Value}"/> 
     <DataGridTextColumn Header="Length" Binding="{Binding Path=Element[duration].Value}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

這引發了一個InvalidOperationException異常,消息「Items集合在使用ItemsSource之前必須是空的,這發生在對DataContext或PropertyChanged的事件處理程序執行賦值時發生,因此無法執行任何操作。 編輯:No it doesn' t,我忘了在我的列定義周圍添加 IanGilham 2010-02-11 11:51:35

+0

異常是我的錯誤,這工作正常 – IanGilham 2010-02-11 12:10:58

+0

呵呵,調試xaml可能會令人厭惡。 – Natxo 2010-02-12 09:01:23

1

如果綁定到某個XmlNode(例如,您正在使用XmlDataProvider),綁定XPath只是相關的。請參閱here

XPath不能用於XDocument類。綁定到XDocument的屬性的唯一方法是正常的Path語法,它不支持XML。

你最好的選擇是使用XmlDataSource,或者通過XDocument將你的Xml文檔轉換成POCO。這是一個使用非常簡單的LINQ:

XDocument doc = XDocument.Load(xmlFile); 

      var tracks = from track in doc.Descendants("data") 
        select new Track() 
           { 
            Name= track.Element("name").Value,  
            Duration= track.Element("duration").Value,  
            etc ... 
           }; 
LibraryView.ItemsSource = tracks; 
+0

但你會如何加載整個XML文檔在DataGrid中進行編輯。我的意思是,如何將某些XML元素及其屬性映射到DataGrid列並僅編輯這些列? – 2013-11-09 16:12:31

相關問題