2010-08-25 113 views
0

我剛剛開始學習WPF/C#,我選擇了一個實際上對我有用的項目,而不是「Hello,World!」的變體。程式。是否可以在WPF中選擇Datagrid分組順序?

這是一個小型應用程序,用於輪詢遊戲服務器的玩家信息並將其綁定到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

要回答你最後一個問題:) OrderBy在這裏沒有意義,因爲在對玩家進行排序後,你將該列表放入一個CollectionView中,並將其按照Team進行排序(因爲該組是Team上的) 。

爲了讓它們按照正確的順序排列,你可以在將它們放入ListCollectionView之前按Team進行排序。但是,這會將它們按字母順序排列 - 而不是您想要的順序。您需要實現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" 
    } 
} 

希望這會有所幫助!

+0

非常感謝!我知道肯定有辦法,但WPF對我來說仍然很陌生。 一切工作完美,你已經救了我幾天盯着顯示器抓我的頭。再次感謝! – coldandtired 2010-08-25 22:45:40