是否可以在WPF中选择Datagrid分组顺序?

时间:2010-08-25 19:51:19

标签: wpf datagrid grouping

我刚开始学习WPF / C#,我选择了一个对我有用的项目,而不是“Hello,World!”的变体。程序

这是一个小应用程序,可以轮询游戏服务器以获取玩家信息并将其绑定到DataGrid。数据按团队分组,可以是以下四个值之一:蓝色,红色,旁观者或无。

我的Linq查询工作正常,DataGrid分组几乎是好的,除了一个小问题:四个团队组的顺序每次都不同。有时红色是第一个,有时是无等等。

我有什么办法可以强迫小组进入上面的顺序吗?

这是Linq查询(addr是服务器ip):

private void get_server(string addr)
    {
        var loc = "http://ukcs.gameme.com/api/serverinfo/" + addr + "//players";
        XDocument doc = XDocument.Load(@loc);

        var server = new ObservableCollection<Player>
            (from player in doc.Descendants("player")
            orderby player.Element("rank").Value
            select new Player
            {
                name = player.Element("name").Value,
                team = player.Element("team").Value,
                frags = player.Element("kills").Value + ":" + player.Element("deaths").Value,
                rank = int.Parse(player.Element("rank").Value)
            });

        server.OrderBy(p => p.rank);
        ListCollectionView collection = new ListCollectionView(server);
        collection.GroupDescriptions.Add(new PropertyGroupDescription("team"));
        player_list.ItemsSource = collection;
    }

第二个问题是OrderBys似乎都没有效果。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

首先回答你的上一个问题:) OrderBy在这里没有任何意义,因为在对玩家进行排序之后,你将列表放在一个CollectionView中,并使用一个分组迅速对其进行排序(因为分组在Team上)。

要按顺序获取它们,您可以在将它们放入ListCollectionView之前按Team对它们进行排序。但是,这将按字母顺序排列 - 而不是您想要的顺序。你需要实现IComparable并把它放在你的sort方法中 - 我已经重写了你的方法(我不太擅长那个Linq形式 - 所以,请耐心等待:):

你通过引入一些不必要的东西让自己变得有点困难 - 我试图将它们解决掉。

private void get_server(string addr)
{
   var loc = "http://ukcs.gameme.com/api/serverinfo/" + addr + "//players";
   var doc = XDocument.Load(@loc);

   var server = doc.Descendants("player")
            .Select(player => new Player
                                  {
                                      name =player.Element("name").Value,
                                      team=player.Element("team").Value,
                                      frags=player.Element("kills").Value +":" +player.Element("deaths").Value,
                                      rank=int.Parse(player.Element("rank").Value)
                                  })
            .OrderBy(p => p.team,new CustomSort())
            .ThenBy(p => p.rank).ToList();
    var collection = new ListCollectionView(server);
    collection.GroupDescriptions.Add(new PropertyGroupDescription("team"));
    player_list.ItemsSource = collection;
}
public class CustomSort : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x.Equals(y))
            return 0;
        if (y.Equals("None") || x.Equals("Blue"))
            return 1;
        if (x.Equals("None") || y.Equals("Blue"))
            return -1;
        if (x.Equals("Red")|| y.Equals("Spectator"))
            return -1;
        return 1; // y == "Red" and x == "Spectator"
    }
}

希望这有帮助!