Impossible de lier la liste d’éléments dans la colonne GridView

Je construis une application qui montre à l’utilisateur le résultat en direct d’une série de matches. J’ai configuré la structure des données comme suit: Counsortinges->Leagues->Matches En particulier dans ViewModel, j’ai créé une collection observable de pays comme suit:

 private ObservableCollection _counsortinges = new ObservableCollection(); public ObservableCollection Country { get { return _counsortinges; } } 

et le modèle:

 public class Country { public ssortingng Name { get; set; } public List League { get; set; } } public class League { public ssortingng Name { get; set; } public List Event { get; set; } } 

la classe Event contient les propriétés de chaque événement, notamment le nom de l’événement, la date, etc.

Je valorise ces données comme suit:

 Country country = new Country(); country.Name = "Italy"; League league = new League(); league.Name = "Serie A"; League league2 = new League(); league2.Name = "Serie B"; Event @event = new Event(); @event.MatchHome = "Inter"; Event event2 = new Event(); @event.MatchHome = "Milan"; league.Event = new List(); league2.Event = new List(); league.Event.Add(@event); league2.Event.Add(event2); country.League = new List(); country.League.Add(league); country.League.Add(league2); lsVm.Country.Add(country); //lsVm contains the ViewModel 

Comment vous pouvez voir je crée un object appelé country (Italie) qui contiendra dans ce cas deux lieues (Serie A) et (Serie B). Chaque ligue contient un match en Serie A -> Inter et Serie B -> Milan

J’ajoute la ligue deux du pays et enfin le pays à la collection observable du modèle de vue. Jusqu’ici pas de problème. Le problème vient du xaml.

J’ai donc organisé tout cela à l’intérieur de GroupViews. Pour ce faire, j’utilise un CollectionViewSource, notamment:

      

le code ci-dessus se trouve dans ma fenêtre.Resources et indiquez à CollectionViewSource d’organiser le nom du pays et le nom de la ligue les ligues respectives associées. J’ai deux ListView comme ceci:

                                 

Le GroupStyle contient les ligues qui contiendront chaque match. Maintenant, le problème est que je ne vois ni ligue ni match, car cet élément se trouve dans une liste. Donc, pour les afficher, je devrais écrire dans le code xaml ce code:

  

cela corrige le bogue du nom de la ligue affiché dans GroupStyle et dans GridView:

  

mais cela ne va bien sûr afficher que l’élément spécifique .. pas la liste des éléments. J’ai besoin d’aide pour remédier à cette situation, je n’arrive pas à comprendre. Merci.

Si vous souhaitez utiliser les capacités de regroupement de ListView , vous devez lui fournir une liste simple des éléments que vous souhaitez regrouper (dans votre cas, les ligues), et non des éléments d’en-tête. CollectionView fait le regroupement pour vous en spécifiant GroupDescriptions .

Par exemple, en supposant que la classe League ait une propriété Country :

 class ViewModel { public ObservableCollection Country { get; } public IEnumerable AllLeagues => Country.SelectMany(c => c.Leagues); } public class League { public ssortingng Name { get; set; } public List Event { get; set; } // add Country here public Country Country { get; set; } } class     

Ensuite, lorsque vous liez les colonnes, vous liez directement aux propriétés de la League , par exemple:

  

Et dans le style de groupe, vous pouvez vous connecter à des propriétés de Country , comme vous l’avez fait.

Solution alternative

Si vous souhaitez afficher des données hiérarchiques dans WPF, vous pouvez utiliser un contrôle qui a été créé pour celle-ci (tel que la grid de données Xceed) ou le pirater avec les détails de ligne de la grid de données WPF intégrée.

Voici un exemple de code XAML (notez qu’il utilise vos structures de données d’origine sans les modifications suggérées ci-dessus). Ce sont essentiellement 3 grids de données nestedes les unes dans les autres. Chaque grid a son propre ensemble de colonnes, vous pouvez donc définir ce que vous voulez pour chaque niveau (pays, ligue, événement).

                                   

Vous aurez également besoin du code du convertisseur que j’ai utilisé:

 public class VisibilityToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => value as Visibility? == Visibility.Visible; public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value as bool? == true ? Visibility.Visible : Visibility.Collapsed; }