7

我已经寻找并尝试了各种解决方案,但到目前为止,它们都没有解决我的问题。我在 Visual Studio 2010/.NET4 中使用 WPF 中的内置 DataGrid 来显示存储为 XDocument 的 XML 文档中的数据。

我的代码运行良好,并且我已验证 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。我会尝试一些建议,看看我能做什么。

4

2 回答 2

8

我使用 Xlinq 并且工作正常,使用 XElement 而不是 XDocument :

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

xml:

<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>
于 2010-02-05T10:36:50.470 回答
1

绑定 XPath 仅在您绑定到 XmlNode 时才相关(例如,您正在使用 XmlDataProvider)。见这里

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;
于 2010-02-05T07:51:25.397 回答