WPF ComboBox, ObservableCollection... Damned!

CH4BRN Messages postés 49 Date d'inscription lundi 19 février 2018 Statut Membre Dernière intervention 6 février 2021 - Modifié le 19 févr. 2018 à 18:18
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 20 févr. 2018 à 10:31
Bonjour ! Chers lecteurs plus adroits que moi, peut-être pourriez vous m'aider.

J'ai une question/un problème :

J'ai un TextBox dans lequel mon utilisateur est sensé rentrer un chemin vers un fichier :

XAML :

<TextBox Grid.Column="0" Grid.Row="1" Text="{Binding FilePath, UpdateSourceTrigger=PropertyChanged}" Margin="5, 0" />


C# :
/// <summary>
      /// Gets or sets the filePath
      /// </summary>
      public string FilePath
      {
          get
          {
              return this._filePath;
          }
 
          set
          {
              this._filePath = value;
              this.RaisePropertyChanged(() => this.FilePath);
              this.UpdateMessageCommand.RaiseCanExecuteChanged();
              if (!this.MessageCanBeUpdated())
              {
                  this.Message = string.Empty;
              }
          }
      }


Puis un bouton sur lequel ce dernier clique quand il a rentré le chemin :



<Button
 Grid.Column="1"
 Grid.Row="1"
 Content="Valider"
 Margin="5, 0"
 Command="{Binding UpdateMessageCommand, Mode=TwoWay}" />


Ce bouton active la méthode déléguée "UpdateMessageCommand :

C#:

 
/// <summary>
    /// Gets or sets the update message command.
    /// </summary>
    public DelegateCommand UpdateMessageCommand { get; set; }


Qui "lance" la méthode "UpdateMessage"

C#:

private void UpdateMessage()
       {
            
           this.OcLogs = fileProvider.LineByLineReading(this.FilePath);
           Console.WriteLine("OCLOGS COUNT = "  + OcLogs.Count);
           this.Message = "Chemin du fichier : " + this.FilePath;
           fileProvider.LineByLineReading(this.FilePath);
       }


OcLogs est une ObservableCollection, et la méthode "fileProvider.LineByLineReading(filePath)" prend un chemin de fichier en paramètre, le lis ligne par ligne, génère un objet "Log" à chaque ligne, et ajoute cet objet Log à une ObservableCollection que la méthode finit par renvoyer à a fin.

Jusque là pas de problèmes, j'obtiens bien une ObservableCollection à partir de mon chemin : lorsque je fais "count" sur la collection, le resultat correspond bien à ce que j'attends (le nombre d'objets est égal au nombre de ligne du fichier. Facile.)

Là ou ça se complique, c'est que je voudrais afficher le contenu de cette collection dans une ComboBox.

Comme ma collection est remplie, je pensais qu'un simple :

<ComboBox Grid.Column="0" Grid.Row="2"  ItemsSource="{Binding OcLogs}" DisplayMemberPath="Session" Margin="5,0" />


suffirait, mais apparemment non...

Quelqu'un à une idée de ce que je pourrais faire?

Merci d'avance!

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
19 févr. 2018 à 18:02
Bonjour

tu as mis plein de codes qui ne concernent pas ta question et pas celui qui serait utile....
Peux tu montrer la classe OcLogs?

PS, pour la coloration syntaxique il faut forcer la couleur en C#, (voir ici) sinon, ça fait des encarts gris.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
19 févr. 2018 à 20:25
Merci à NHenry d'avoir corriger la coloration.
0
CH4BRN Messages postés 49 Date d'inscription lundi 19 février 2018 Statut Membre Dernière intervention 6 février 2021
20 févr. 2018 à 09:07
Du coup, comme mon but était de trier mes données, j'ai utilisé un DataGrid :
Xaml :

<TextBox Grid.Column="0" Grid.Row="1" Text="{Binding FilePath, UpdateSourceTrigger=PropertyChanged}" Margin="5, 0" />
 
 <DataGrid
           Grid.Column="0"
           Grid.ColumnSpan="2"
           Grid.RowSpan="2"
           Grid.Row="4"
           ItemsSource="{Binding Path=OcLogs, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
           AutoGenerateColumns="True"
           Margin="5,0"/>
 
<Button Grid.Column="1" Grid.Row="1" Content="Valider" Margin="5, 0" Command="{Binding UpdateMessageCommand, Mode=TwoWay}" Click="Button_Click" />


et du côté du c# :
    /// <summary>
      /// base collection for the comboBox
      /// </summary>
      private ObservableCollection<Log> _ocLogs { get; set; }
      /// <summary>
      /// gets or sets the Log collection
      /// </summary>
      public ObservableCollection<Log> OcLogs
      {
          get
          {
              return _ocLogs;
          }
          set
          {
               
              _ocLogs = value;
              this.RaisePropertyChanged(() => this.OcLogs);
 
          }
      }
 
/// <summary>
      /// Gets or sets the update message command.
      /// </summary>
      public DelegateCommand UpdateMessageCommand { get; set; }
 
      /// <summary>
      /// Initialize all commands.
      /// </summary>
      public override void InitializeCommand()
      {
          base.InitializeCommand();
 
          this.UpdateMessageCommand = new DelegateCommand(this.UpdateMessageAndCombo, this.MessageCanBeUpdated);
      }
 
      /// <summary>
      /// Update the message displayed.
      /// </summary>
      private void UpdateMessageAndCombo()
      {
           
          this.OcLogs = fileProvider.LineByLineReading(this.FilePath);
          Console.WriteLine("OCLOGS COUNT = "  + OcLogs.Count);
          this.Message = "Chemin du fichier : " + this.FilePath;
           
           
      }




Et j'obtiens une grille de données avec toutes mes infos.

Merci de m'avoir répondu. Et désolé pour le "flou" de mon sujet, je suis débutant en WPF, je navigue un peu dans le brouillard.
Vous risquez de me revoir !
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
20 févr. 2018 à 10:31
Si cela résout ton problème, merci de marquer le sujet résolu
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#marquer-un-sujet-resolu

Sinon, pour la combobox, je pense qu’il faut que OcLogs implémente INotifyPropertyChanged
0
Rejoignez-nous