【问题标题】:How to bind xml to the WPF DataGrid correctly?如何正确将 xml 绑定到 WPF DataGrid?
【发布时间】:2011-01-13 01:43:05
【问题描述】:

我已经寻找并尝试了各种解决方案,但到目前为止,它们都没有解决我的问题。我在 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。我会尝试一些建议,看看我能做什么。

【问题讨论】:

    标签: wpf data-binding wpfdatagrid


    【解决方案1】:

    我使用 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>
    

    【讨论】:

    • 这会引发 InvalidOperationException 并显示消息,“在使用 ItemsSource 之前,Items 集合必须为空。这发生在对 DataContext 或 PropertyChanged 的​​事件处理程序中执行分配时,因此阻止了任一实现。编辑:不,它没有,我忘了在我的列定义周围添加
    【解决方案2】:

    绑定 XPath 仅在您绑定到 XmlNode 时才相关(例如,您正在使用 XmlDataProvider)。见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;
    

    【讨论】:

    • 但是您将如何加载整个 XML 文档以在 DataGrid 中进行编辑。我的意思是,如何将某些 XML 元素及其属性映射到 DataGrid 列并只编辑那些?
    猜你喜欢
    • 2014-10-23
    • 2011-03-01
    • 1970-01-01
    • 2011-05-14
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多