Как связать xml с WPF DataGrid правильно?

Я искал и попробовал различные решения, но до сих пор ни один из них не решает мою проблему. Я использую встроенный 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 сам. Я буду пробовать некоторые предложения и видеть то, что я могу взяться за работу.

7
задан IanGilham 11 February 2010 в 10:20
поделиться

2 ответа

Я использовал 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>
9
ответ дан 7 December 2019 в 01:20
поделиться

Привязка 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;
1
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: