WPF ComboBox, ObservableCollection... Damned!

Signaler
Messages postés
49
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
23 janvier 2020
-
Messages postés
14759
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
-
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.
A voir également:

3 réponses

Messages postés
14759
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
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.
Messages postés
14759
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Merci à NHenry d'avoir corriger la coloration.
Messages postés
49
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
23 janvier 2020

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 !
Messages postés
14759
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
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