1

我正在开发 Windows 应用商店应用程序。我有这样的 XML:

<?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

我只想在那里只有一个酷玩乐队。我想要的只是不同的输出。感谢您的反馈和帮助。问候...

4

2 回答 2

1

我远离我的 win8 开发机器。我不确定 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);

根据您的需要,您可能只想向列表视图发送一个仅包含名称的数据源。

lvSingers.ItemsSource = data.Select(ex => (string)ex.name).Distinct();
于 2013-06-28T16:53:05.663 回答
1

问题是,即使艺术家姓名重复,您也有不同的项目,因为酷玩乐队的歌曲不同。因此,您可以将您的 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();
于 2013-06-28T17:05:39.737 回答