Можно ли выбрать порядок группировки данных в WPF? - PullRequest
0 голосов
/ 25 августа 2010

Я только начал изучать WPF / C # и выбрал проект, который на самом деле был бы мне полезен вместо вариантов «Hello, World!» программы.

Это небольшое приложение, которое опрашивает игровой сервер на предмет информации об игроке и привязывает его к DataGrid. Данные сгруппированы по командам, которые могут иметь одно из четырех значений: синий, красный, зритель или нет.

У меня нормально работает запрос Linq, и группировка DataGrid почти хороша, за исключением одной маленькой проблемы: порядок групп из четырех команд каждый раз различается. Иногда сначала красный, иногда нет и т. Д.

Есть ли способ заставить группы в указанном выше порядке?

Вот запрос Linq (адрес - 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 Ответ

2 голосов
/ 26 августа 2010

Чтобы ответить на ваш последний вопрос первым :) Здесь OrderBy не имеет смысла, потому что после сортировки игроков вы помещаете список в CollectionView с группировкой, которая быстро сортирует его по Team (так как группировка по Team).

Чтобы получить их в правильном порядке, вы можете отсортировать их по Team, прежде чем помещать их в ListCollectionView.Тем не менее, это приведет их в алфавитном порядке, а не в том порядке, который вы хотели.Вам нужно реализовать IComparable и поместить это в ваш метод сортировки - я немного переписал ваш метод (я не очень хорош в этой 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"
    }
}

Надеюсь, это поможет!

...