Я искал и попробовал различные решения, но до сих пор ни один из них не решает мою проблему. Я использую встроенный DataGrid от WPF в Visual Studio 2010/.NET4 для отображения данных из XML-документа, сохраненного как XDocument.
Мой код все хорошо работает, и я проверил, что 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 (загруженный с веб-сервиса) к свойству TrackList (который реализует INotifyPropertyChanged). Никакая последующая обработка не сделана на нем.
Я ранее попытался использовать XLinq, связать с результатом запроса, который не работал ни один (та же проблема), таким образом, я думал, что попробую подход XPath, чтобы не писать потенциально ошибочный оператор Linq и пытаться найти проблему.
У меня заканчиваются идеи для того, как заставить DataGrid отображаться правильно. Моему пониманию того, как это, как предполагается, работает, ясно недостает, таким образом, я был бы очень признателен за любую предлагаемую справку.
Править: Стоит отметить, что у меня есть некоторая гибкость с форматом входных данных, поскольку я загружаю необработанный XML сам. Я буду пробовать некоторые предложения и видеть то, что я могу взяться за работу.
Я использовал 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>
Привязка XPath актуальна только в том случае, если вы привязываетесь к чему-то, что является XmlNode (например, вы используете XmlDataProvider). См. здесь .
XPath не работает с классами XDocument. Единственный способ привязки к свойствам XDocument - это обычный синтаксис Path, который не поддерживает XML.
Лучше всего либо использовать XmlDataSource, либо преобразовать ваш XML-документ через XDocument в 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;