将 XElement 绑定到数据网格

Binding XElement to Datagrid

我是第一次尝试 XElement 绑定,如果这很愚蠢,我深表歉意。我有一个 XML 需要绑定到 DataGrid。

Music.xml:

<Music>
    <Album Title="Chris Sells Live" Artist="Chris Sells" ReleaseDate="2/5/2008" /> 
    <Album Title="The Road to Redmond" Artist="Luka Abrus" ReleaseDate="4/3/2008"/> 
    <Album Title="The Best of Jim Hance" Artist="Jim Hance" ReleaseDate="6/2/2008"/> 
</Music>

代码隐藏:

InitializeComponent();
XElement MyMusic = XElement.Load("Music.xml"); 
this.XElementContainer.DataContext = MyMusic.Elements("Album");

以上代码从 Music.Xml 文件

获取 XElement

XAML : <DataGrid x:Name="XElementContainer" ItemsSource="{Binding}"/>

我得到的输出 [![它正在绑定 XElement 的属性。我需要绑定指定节点的子元素,即具有 Title、Artist 和 Release Date 子节点的 Album]

我期待数据网格中的输出,我不想在其中创建任何静态 DataGridTextColumn。是否可以仅绑定 XElement 数据并获得这样的结果?:

Title                 |Artist       |ReleaseDate
    Chris Sells Live       Chris Sells   2/5/2008
    The Road to Redmond    Luka Abrus    4/3/2008
    The Best of Jim Hance  Jim Hance     6/2/2008

当直接绑定到 XML 数据时,Datagrid 无法自动生成列,这是您通常想要使用视图模型的(次要)原因之一。

实际上,它可以根据您绑定到的对象的 class 的属性自动生成列。这就是为什么您会在那些自动生成的列中看到 XElement 的属性。

如果您想绑定到 XML,您必须声明您的列:

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Attribute[Title].Value}" Header="Title" />
    <DataGridTextColumn Binding="{Binding Path=Attribute[Artist].Value}" Header="Artist"/>
    <DataGridTextColumn Binding="{Binding Path=Attribute[ReleaseDate].Value}" Header="ReleaseDate"/>
</DataGrid.Columns>