using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Data; namespace App11 { public class PlayerViewModel { public PlayerViewModel() { PlayerService playerService = new PlayerService(); var data = playerService.GetData(); GeneratePanierByStatusGroup(data); cvs.Source = Players; SynchronizationContext sc = SynchronizationContext.Current; Task.Run(() => { Random rnd = new Random(); for (int i = 0; i < 1000; i++) { Thread.Sleep(100); int k = rnd.Next(0, data.Count); sc.Post(new SendOrPostCallback((state) => { int index = (int)state; data[index].Number = rnd.Next(1, 25); }), k); } }); } CollectionViewSource cvs = new CollectionViewSource() { IsSourceGrouped = true }; public ICollectionView PlayerSource { get => cvs.View; } private ObservableCollection _players = new ObservableCollection(); public ObservableCollection Players { get => _players; } private void GeneratePanierByStatusGroup(List players) { var query = from item in players group item by item.Position into g orderby g.Key select new { GroupName = g.Key, Items = g }; foreach (var g in query) { GroupInfosList info = new GroupInfosList(); info.Key = g.GroupName + " (" + g.Items.Count() + ")"; foreach (var item in g.Items) info.Add(item); _players.Add(info); } } } public class Player : INotifyPropertyChanged { public string FullName { get; set; } private int _number; public int Number { get => _number; set { _number = value; OnPropertyChanged(); } } public PlayerPosition Position { get; set; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public enum PlayerPosition { Striker, Defender, Goalkeeper, Midfielder, Coach } public class GroupInfosList : List { public object Key { get; set; } } public class PlayerService { public List GetData() { return new List() { new Player { FullName = "Didier Deschamps", Position = PlayerPosition.Coach }, new Player { FullName = "Hugo Lloris", Number = 23, Position = PlayerPosition.Goalkeeper }, new Player { FullName = "Steve Mandanda", Number = 23, Position = PlayerPosition.Goalkeeper }, new Player { FullName = "Alphonse Areola", Number = 23, Position = PlayerPosition.Goalkeeper }, new Player { FullName = "Benjamin Pavard", Number = 2, Position = PlayerPosition.Defender }, new Player { FullName = "Djibril Sidibé", Number = 19, Position = PlayerPosition.Defender }, new Player { FullName = "Presnel Kimpembe", Number = 3, Position = PlayerPosition.Defender }, new Player { FullName = "Adil Rami", Number = 17, Position = PlayerPosition.Defender }, new Player { FullName = "Raphaël Varane", Number = 4, Position = PlayerPosition.Defender }, new Player { FullName = "Samuel Umtiti", Number = 5, Position = PlayerPosition.Defender }, new Player { FullName = "Raphaël Varane", Number = 4, Position = PlayerPosition.Defender }, new Player { FullName = "Lucas Hernandez", Number = 21, Position = PlayerPosition.Defender }, new Player { FullName = "Benjamin Mendy", Number = 22, Position = PlayerPosition.Defender }, new Player { FullName = "N'Golo Kanté", Number = 13, Position = PlayerPosition.Midfielder }, new Player { FullName = "Blaise Matuidi", Number = 14, Position = PlayerPosition.Midfielder }, new Player { FullName = "Steven Nzonzi", Number = 15, Position = PlayerPosition.Midfielder }, new Player { FullName = "Paul Pogba", Number = 6, Position = PlayerPosition.Midfielder }, new Player { FullName = "Corentin Tolisso", Number = 12, Position = PlayerPosition.Midfielder }, new Player { FullName = "Ousmane Dembélé", Number = 11, Position = PlayerPosition.Striker }, new Player { FullName = "Nabil Fekir", Number = 18, Position = PlayerPosition.Striker }, new Player { FullName = "Olivier Giroud", Number = 9, Position = PlayerPosition.Striker }, new Player { FullName = "Antoine Griezmann", Number = 7, Position = PlayerPosition.Striker }, new Player { FullName = "Thomas Lemar", Number = 8, Position = PlayerPosition.Striker }, new Player { FullName = "Kylian Mbappé", Number = 10, Position = PlayerPosition.Striker }, new Player { FullName = "Florian Thauvin", Number = 20, Position = PlayerPosition.Striker } }; } } }