WPF problème de Binding

Résolu/Fermé
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 - 9 nov. 2021 à 12:47
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 9 nov. 2021 à 18:06
Bonjour à tous
Je rencontre une difficulté sur une application WPF C# je suis sous Windows10
Dans une fenêtre j'ai 2 Listbox
<ListBox x:Name="List40TimeTable" DataContext="{Binding .}" ItemsSource="{Binding TmtValides}"

ListBox x:Name="List40Trajet" DataContext="{Binding .}" ItemsSource="{Binding TrjValides}"


La fenêtre W40Gestionnaire

     public partial class W40Gestionnaire : Window
{
#region Déclarations Variables *********************************************************************
public List<C02TimeTable> timetables = new List<C02TimeTable> { };
public ObservableCollection<C02TimeTable> TmtValides { get; set; }

public List<C02Trajet> trajet = new List<C02Trajet> { };
public ObservableCollection<C02Trajet> TrjValides { get; set; }

#endregion

#region W00Main - Constructeur *********************************************************************

public W40Gestionnaire()
{
InitializeComponent();
InstanciationTimeTables();
InstanciationTrajet(5555);
this.DataContext = this;
}


la classe C02TimeTable contient des Horaires de trains, chaque horaire est lié à un trajet
la classe C02Trajet contient les Trajet un trajet peut avoir plusieurs étapes
Horaires et Trajet proviennent de deux table Access le lien étant le numéro de trajet

Au lancement de l'application mes deux Listbox s'affichent correctement
TimesTables avec tous les horaires
Trajet avec toutes les étapes du trajet 5555

Dans la Listbox des timetables j'ai un bouton qui me permet de choisir un des horaires
        private void BtnW40Edition_Click(object sender, RoutedEventArgs e)
{
C02TimeTable tmt = (C02TimeTable)((Button)sender).DataContext;
InstanciationTrajet(tmt.TmtNum);
this.DataContext = this;
}

Vous l'aurez comris le but est d'afficher dans l'autre ListBox les éléments correspondant à ce choix.
Et là est mon soucis car la ListBox Trajet ne se met pas à jour !!!
ci-dessous les deux Méthodes pour servir les ObservableCollection

        public int InstanciationTimeTables()
{
int xId = 0;
try
{
using (OleDbConnection connection = new OleDbConnection(W00Main.DbAccess))
{
string sql = "SELECT * FROM TimeTable WHERE TmtValide = true ORDER BY TmtHeureDepart; ";
int i = 0;
OleDbCommand command = new OleDbCommand(sql, connection);
connection.Open();
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
if (!reader.IsDBNull(reader.GetOrdinal("TmTid"))) { xId = reader.GetInt32(0); }
timetables.Add(new C02TimeTable(xId));
i++;
}
reader.Close();
TmtValides = new ObservableCollection<C02TimeTable>(timetables.Where(l => l.TmtValide));
this.DataContext = this;
return i;
}
} // fin du try
catch (Exception er)
{
MessageBox.Show("RobAccess1 Lecture Table TimeTable: " + er.Message);
return -1;
}
}



   public int InstanciationTrajet(int num)
{
int xId = 0;
string sql = "";
trajet.Clear();
try
{
using (OleDbConnection connection = new OleDbConnection(W00Main.DbAccess))
{
if (num == 0)
{
sql = "SELECT * FROM Trajet ORDER BY TrjNum ; ";
}
else
{
sql = "SELECT * FROM Trajet WHERE TrjNum=" + num + " ORDER BY TrjNum ; ";
}
//System.Windows.Forms.MessageBox.Show("sql " + sql);
int i = 0;
OleDbCommand command = new OleDbCommand(sql, connection);
connection.Open();
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
if (!reader.IsDBNull(reader.GetOrdinal("TrjId"))) { xId = reader.GetInt32(0); }
trajet.Add(new C02Trajet(xId));
i++;
}
//System.Windows.Forms.MessageBox.Show("trajet " + trajet.Count.ToString()); ;
reader.Close();
TrjValides = new ObservableCollection<C02Trajet>(trajet.Where(l => l.TrjValide));
System.Windows.Forms.MessageBox.Show("W40Gestionnaire TrjValides " + TrjValides.Count.ToString()); ;
this.DataContext = this;
return i;
}
} // fin du try
catch (Exception er)
{
MessageBox.Show("RobAccess1 Lecture Table Trajet: " + er.Message);
return -1;
}
}



Merci à ceux qui pourront me mettre sur une piste.
A voir également:

3 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
9 nov. 2021 à 13:00
Bonjour

Tout d’abord, merci d’avoir essayé d’utiliser la coloration syntaxique, mais comme tu peux le voir, les pavés gris, c’est pas ça qui est ça.
Pour la suite, merci de lire ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code et de choisir xml et c#.

Ton problème vient du fait, que tu changes complètement d’instance de ta collection, en créant une nouvelle instance à la mise à jour.
Le binding lui reste lié à l’instance précédente.

Première solution:
Tu ne fais pas de new, mais tu cleares, puis tu ajoutes les items

Deuxième solution:
Tu rends ta fenêtre INotifyPropertyChanged et tu signales au binding que l’instance bindée a changé.

Troisième solution
Tu écris une classe LeTrajet, qui contient en propriétés sa liste d’horraires, ensuite tu bindes la seconde listbox à cette propriété du selectedObject de la première listbox
1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
9 nov. 2021 à 18:06
Si ça te convient pense à marquer le sujet résolu.

Pour bien coder en wpf, il faut avant tout bien écrire ses objets.

Ps: quand Georges Burns a fait cette citation, il était presque centenaire et il est décédé en 96 ;)
1
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 1
9 nov. 2021 à 14:12
Merci de cette prompte et efficace réponse.
J'ai opté pour la première solution, que j'avais tentée sans succès, mais là c'est OK

Merci beaucoup, je regarderais tes autres solutions car il y toujours à apprendre.
J'ai 71ans ( quand j'étais petit la mer morte n'était même pas malade) et je viens du monde des automatismes WinForm m'était plus accessible mais il est vrai que WPF à de réels atouts, par contre cela me demande de gros efforts heureusement que vous êtes disponible

Merci encore
Pour info mon application est un pilote de réseau ferroviaire miniature.
0