WPF problème de Binding
Résolu
robunccm
Messages postés
53
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour à tous
Je rencontre une difficulté sur une application WPF C# je suis sous Windows10
Dans une fenêtre j'ai 2 Listbox
La fenêtre W40Gestionnaire
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
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
Merci à ceux qui pourront me mettre sur une piste.
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:
- Failed to local inject class with binding id 25744
- Appdata local - Guide
- Ip local - Guide
- Qwerty to azerty - Guide
- Local send - Télécharger - Divers Utilitaires
- Id telephone - Guide
3 réponses
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
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
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 ;)
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 ;)
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.
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.