2013-06-28 5 views
1

Я разрабатываю приложение для Windows Store. У меня есть такой XML:WinStore App Listview: Избегание нескольких строк с тем же именем

<?xml version="1.0" encoding="utf-8" ?> 
<music> 
    <singer> 
    <name>Coldplay</name> 
    <song>Scientist</song> 
    <lyrics>lol lalala</lyrics> 
    </singer> 
    <singer> 
    <name>Coldplay</name> 
    <song>test2</song> 
    <lyrics>lol lalala2</lyrics> 
    </singer> 
    <singer> 
    <name>another</name> 
    <song>şarkı</song> 
    <lyrics>lol lalala3</lyrics> 
    </singer> 
</music> 

Код C#, "lvSingers" - мой список. Я записал там имена певцов.

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    string musicXMLPath = Path.Combine(Package.Current.InstalledLocation.Path, "Assets/test.xml"); 
    XDocument loadedData = XDocument.Load(musicXMLPath); 
    var data = from query in loadedData.Descendants("singer") 
       select new Singer 
       { 
        name = (string)query.Element("name"), 
        song = (string)query.Element("song"), 
        akor = (string)query.Element("lyrics") 
       }; 
    lvSingers.ItemsSource = data; 
} 

} 

Когда я запускаю этот код, я получаю несколько имен певцов, я хочу этого избежать. Пример:

Coldplay 
Coldplay 
another 

Я просто хочу иметь ТОЛЬКО один Coldplay. Короче всего, я хочу, это отличный результат. Буду признателен за ваши отзывы и помощь. С уважением ...

+0

В вопросе SO есть хороший образец, который вы можете использовать; посмотрите http://stackoverflow.com/questions/1021679/linq-to-xml-noob-question-distinct-and-order-by-on-attributes – Joe

+0

Спасибо за помощь, но она не работает. Я уже пробовал это. – Alasse

ответ

1

Проблема заключается в том, что, даже если имя художника повторяется, у вас есть различные элементы, так как песни различны для Coldplay. Таким образом, вы можете связать свой ItemsSource с отдельным списком и установить свойство SelectedArtist, используя что-то вроде:

XDocument doc = XDocument.Load("Music.xml"); 
var data = doc.Descendants("singer").Select(x => new Singer { 
    Name = (string)x.Element("name"), 
    Song = (string)x.Element("song"), 
    Lyrics = (string)x.Element("lyrics") 
}); 
List<string> dataToBind = data.Select(x => x.Name).Distinct().ToList(); 
+1

Это сработало! Спасибо :) – Alasse

+0

Хорошо; Я на самом деле просто готовлю пример приложения WPF, чтобы убедиться, но образец работал в моем тестовом приложении для консоли. – Joe

1

Я вдали от своей машины win8 dev. Я не уверен, как listview обрабатывает группировку. Вы можете попробовать следующее.

var data = from query in loadedData.Descendants("singer") 
       select new Singer 
       { 
        name = (string)query.Element("name"), 
        song = (string)query.Element("song"), 
        akor = (string)query.Element("lyrics") 
       }.GroupBy(ex => ex.name); 

В зависимости от того, что вам нужно, вы можете просто отправить listview источник данных, содержащий только имена.

lvSingers.ItemsSource = data.Select(ex => (string)ex.name).Distinct(); 
+0

Спасибо, он работает как шарм, но «из запроса в loadedData.Descendants (« singer ») выбрать новый Singer { name = (string) query.Element (" name "), song = (string) query. Element ("song"), akor = (string) query.Element ("lyrics") } " должен быть в скобках. С уважением :) – Alasse