Reorganiser une list d'object [Résolu]

Signaler
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021
-
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
-
Bonjour,
je me trouve face a un petit problème.
J'ai un Model Mur et un Model Brique;
Mon Mur a une propriété int Height et int Width.
Ma brique a une propriété int Id.
Quant je rentre 2 dans Height et 10 dans Width ,ça fabrique un mur de 2 briques de haut sur 10 de large et en même temps ça me rempli une observable collection de 20 Briques.
Ma collection de brique bind une uniformgrid.

Jusqu'ici tout va bien j’obtiens bien le visuel que je veux:


Ma liste brique est trier par Id comme ceci = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20).
J'aurais voulu pouvoir re-trier ou recréer une autre liste pour qu'elle ressemble a ça:
1,11,2,12,3,13,4,14,5,15,6,16,7,17,8,18,9,19,10,20...........).
En gros refaire une liste mais avec un ordre de sélection vertical des Id.

J'ai essayer plusieurs chose savant de vous solliciter (for ,foreach ,linq) en vain.

Merci d'avance pour vos réponses .
bonne journée.

9 réponses

Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
D'abord simplifions un peu la génération de ta collection
            for (int i = 0; i < 6; i++) 
            {
                Brique b = new Brique { Id = i + 1 };//En une ligne tu instancies et affecte la propriété Id

                VisualBrique.Add(b);
            }

Ensuite, si l'effet recherché n'est que visuel, tu peux utiliser un ItemsControl wrappé verticalement
        <ItemsControl ItemsSource="{Binding VisualBrique}" Height="65" Width="45">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Vertical"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness="2" Height="20" Width="20" BorderBrush="Red" Background="LightGray">
                        <TextBlock Text="{Binding Id}" Foreground="White"/>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>




Bien sûr on peut s'arranger pour faire en sorte que la taille (et par extension le nombre de lignes et de colonnes) soit bindable.
Mais avant d'aller plus loin confirme moi si ça te convient.
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
Impec.

Pense à marquer le sujet résolu.
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
Bonjour

pour pouvoir essayer de t'aider, il faut comprendre la logique tu tri.
Or là ça ne saute pas aux yeux.
Peux tu expliquer cette logique?

Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021

Salut Whis
D'accord pour le WPF . Mais le WPF est juste là pour la construction de l'interface graphique . Et moi je n'agis que sur la collection VisualBrique pour le code qu'il doit ajouter .
Mon projet lui est bien en Windows Forms classique . J'ai déjà essayer le WPF mais sans succès ( pire que les classes à mes débuts et dont je te remercie pour le prof que tu as été )
Dis-moi si je me trompe !
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546 >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Non tu ne trompes pas et trier vraiment la collection est une solution.
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021
>
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Salut Vb,
je n'avais pas vue ton message,désolé.
Merci d'avoir passé du temps sur mon problème.
J'avais également trouvé une solution (tirer par les cheveux) qui fonctionnait tant que height ne dépassait pas 2.... mais malheureusement la plupart du temps le height dépasse 2.

 ObservableCollection<Brique> br = new ObservableCollection<Brique>();
                for (int i = 0; i < VisualBrique.Count; i++)

             {
                    Brique items = VisualBrique.Where(x => x.Id == i + Width + 1).FirstOrDefault();
                     br.Add(VisualBrique[i]);
                     br.Add(items);
              }
           
               VisualBrique.Clear();
              VisualBrique.AddRange(br);
              br.Clear();
            }


Merci encore bonne journée.
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021

Bonjour dragonfly22000
Avez-vous trouvé une solution si Height dépasse 2 ?
Désolé je viens de voir que vous avez solutionné autrement au message 11 .
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021
>
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Salut Vb
si ça t’intéresse j'ai trouvé une solution avec une boucle for pour un Height >2.
Bonne soirée a+.
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
Comme ça?


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021

Exactement .
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
Et ben un p'tit dessin dès le début aurait été d'un grand secours ;)
Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021

Salut Whismeril , merci pour le coup de main.
Au début je voulais vraiment changer l'ordre de ma liste avec une fonction.....
Après plusieurs heures de recherche et de brainstorming je me suis rendu compte que je me prenais la tête pour rien.
J'ai donc adopter ta solution à pars que mon itempaneltemplate est une Uniformgrid.
Le problème c'est qu'a la base ce composant ne possède pas de paramètre d'orientation mais en fouillant sur le net j'ai trouver une classe dérivé qui l' implémente....Youpi.
J'ai donc rajouté un Boleen(checkbox) lié a un converter afin que l'utilisateur puisse travailler horizontalement ou verticalement.
Merci encore pour moi c'est résolu.
Bonne journée a toi merci encore.
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
Hello,
moi ce qui m'intéressait c'est de voir comment tu as fait avec l'Uniformgrid.
Parce qu'en fait, ça ne se binde pas.
Du coup avoir une observablecollection n'a (avec les éléments que j'ai) pas d'intérêt.
C'est d'ailleurs pour cette raison que je t'avais proposé une solution avec un panel.

Messages postés
49
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
13 avril 2021

Salut Whismeril pas de soucis.
En fait l'uniformgrid me sert juste pour l'item panel template que je bind en hauteur(nombre de ligne) et largeur(nombre de colonne) .
Après ce sont mes item template que je bind a ma propriété Id.

 <ListBox ItemsSource="{Binding VisualBrique }"  
SelectionMode="Multiple"   Padding="-1" 
Margin="0" 
BorderThickness="0">
                                <ListBox.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <UniformGrid Rows="{Binding Height}"  Columns="{Binding Width}"  Margin="0" />
                                    </ItemsPanelTemplate>
                                </ListBox.ItemsPanel>
                                <ListBox.ItemContainerStyle>
                                    <Style TargetType="ListBoxItem">
                                        <Style.Triggers>
                                            <Trigger Property="IsSelected" Value="True">
                                                <Setter Property="Opacity" Value="0.1"/>
                                                <Setter Property="Background" Value="Transparent"/>
                                            </Trigger>
                                        </Style.Triggers>
                                        <Setter Property="Padding" Value="0"/>
                                        <Setter Property="Margin" Value="0"/>
                                        <Setter Property="BorderThickness" Value="10"/>
                                        <Setter Property="Background" Value="DarkGray"/>
                                        <Setter Property="BorderBrush" Value="Red"/>
                                        <Setter Property="Cursor" Value="Hand"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                        <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
                                    </Style>
                                </ListBox.ItemContainerStyle>
                                <ListBox.ItemTemplate>
                                    <DataTemplate DataType="{x:Type vm:ViewBriqueViewModel}">
                                        <TextBox  Foreground="White" Text="{Binding Id}" FontSize="200"  VerticalContentAlignment="Center"  HorizontalContentAlignment="Center" IsReadOnly="True"    HorizontalAlignment="Stretch" VerticalAlignment="Center" Background="Transparent"   >
                                        </TextBox>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>


Ps:ViewBriqueViewModel est mon view model(classe) de "Brique".

Je te balance tout le code ,je sais pas si tu trouveras ça très clair n’hésite pas a me demander s'il y a un truc que tu capte pas.....Ça fait plaisir.
Pour une fois que je peux aider.
Bonne soirée
Messages postés
15950
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 mai 2021
546
OK.
C'est quasiment la même chose que je te proposais.
J'ai mis un itemscontrol comme contenant parce que tu n'avais parlait que de l'uniformgrid et j'avais supposé que tu ne voulais pas d'ascenceur.
Et comme paneltemplate j'ai pris le wrappannel car justement son but est de mettre à la suite les items à l'horizontale ou à la verticale.