IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[WPF]Problème d'update de binding


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut [WPF]Problème d'update de binding
    Bonjour,

    J'ai dans une fenêtre une ListBox contenant des items bindés à une SortedList qui contient une liste de business objects classé par un objet DateTime :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SortedList<DateTime, MyObject>
    Dans cette même fenêtre, j'ai une ComboBox qui contient une liste d'année. Quand je change une année pour un item de la listbox, mon BusinessObject correspondant se met bien à jour, mais ma listBox elle ne se met pas à jour. En fait, l'ordre des éléments de ma ListBox devrait changer.
    Il est correct quand je relance mon appli, mais il ne se met pas à jour en temps réel.
    Voici mon code XAML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ComboBox x:Name="cbChoixAnnee" SelectionChanged="cbChoixAnnee_SelectionChanged" Loaded="cbChoixAnnee_Loaded" Grid.Column="1" Grid.Row="1" SelectedItem="{Binding Path=Annee, UpdateSourceTrigger=PropertyChanged}">
    .....
    <ListBox Height="125" SelectionChanged="ChoixMois_SelectionChanged" Name="ChoixMois"  DockPanel.Dock="Left" IsSynchronizedWithCurrentItem="True"  ItemsSource="{Binding}" ItemTemplate="{DynamicResource ListeNDFDispo}"></ListBox>
    Et le codeBehind correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CollectionView myColl =  (CollectionView)CollectionViewSource.GetDefaultView(tiFrais.DataContext);
    MyObject ndf = myColl.CurrentItem as MyObject;
    ndf.Annee = (int)cbChoixAnnee.SelectedItem;
    myColl.Refresh();
    Je ne comprends pas pourquoi, sachant que les autres champs de ma fen^tre eux se mettent bien à jour.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    T'as essayé un Clear sur la CollectionView avant le Refresh ? Je crois qu'il y a un truc comme ça à faire avant...

  3. #3
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Ya pas de méthode Clear sur la CollectionView

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Donc si je comprend bien: lors de la mise à jour, l'objet métier est bien changé mais pas l'affichage. Seulement, si tu masques et réaffiches ton formulaire (ou ce qui doit etre mis à jour), cela marche ?


    Dans ce cas, il faut que ton objet métier implémente l'interface INotifyPropertyChanged


    A+

  5. #5
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Oui c'est presque ça, sauf que ca ne se met jamais à jours. C'est juste quand j'enregistre les données dans ma source de données (ici un fichier XML) et que je redélarre mon application (et donc chargement du XML) que c'est à jour. Ce qui montre que les données sont bien mises à jour, mais pas l'affiche.

    Mon business object implémente bien INotifyPropertyChanged, mais rien n'y fait

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    J'avais eu le même problème et INotifyPropertyChanged a été la solution....

    Tu as bien implémente INotifyPropertyChanged sur toutes tes propriétés ?

  7. #7
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Ben ça dépend
    En fait, je bind ma listbox avec une propriété d'un objet de type A. Cette propriété est une SortedList<DateTime, B> en lecture seule (pas de Set). La classe A n'implémente pas INotifytPropertyChanged.
    Dans ma même page, j'ai des ComboBox et des TextBox qui sont bindés avec l'élément courant de ma SortedList. Des objets de type B, qui lui implémente INotifyPropertyChanged. Quand je modifie la propriété Date de B, ma sortedList dans A est "retriée". Mais les modifications ne sont pas reportées dans la ListBox.

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Cela me semble correct mais dans le doute, tu as essayé d'implémenter INotifyPropertyChanged sur ton objet de type A ?

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Idem, je dirais la même chose, à savoir de bien implémenter INotifyPropertyChanged dans A et de ne pas oublier de lever l'évennement Changed dans le Set des propriétés.

    Si A contient une collection d'objets B, essaye aussi d'implémenter INotifyCollectionChanged dans B, de manière à ce que ça remonte vers A et que le binding se "refreshise" via le PropertyChanged de A

    Aussi, désolé pour le coup du Clear dans la CollectionView, mais j'avais dû faire un truc du genre pour re-trier la totalité d'une vue, j'avais dû mettre à null la DefaultView avant de la re-créer je crois...

  10. #10
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Nop, même en implémentant PropertyChanged sur mon objet A, ça change rien.
    Mais je me suis un peu trompé dans ma description tout à l'heure., en faite, dans ma classe A, ça n'est pas une propiété en lecture seule de type SortedList que j'ai, mais une propriété en lecture seule de type ReadOnlyCollection qui retourne une ReadOnlyCollection contenant la liste des values de mon attribut privé de type SortedList.

    Pour être + clair, voici du code :

    Objet A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class A : INotifyPropertyChanged
    {
       private SortedList<DateTime, B> _malistetrie;
       ...
       public ReadOnlyCollection<B> MaListe
       {
          get { return new ReadOnlyCollection<B>(_malistetrie.Values); }
       }
    }
    Objet B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class B : INotifyPropertyChanged
    {
       private int _year;
       ...
       public int Annee
       {
          get { return _year; }
          set
          {
             _year = value;
             OnPropertyChanged("Annee");
          }
       }
    }
    Code Behind de ma fenêtre WPF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void cbChoixAnnee_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    	CollectionView myColl = (CollectionView)CollectionViewSource.GetDefaultView(monTabItem.DataContext);
    	B ndf = myColl.CurrentItem as B;
     
    	ndf.Annee = (int)cbChoixAnnee.SelectedItem;
     
    	myColl.Refresh();
    }
    Sachant que le DataContext de monTabItem est ma ReadOnlyCollection de ma classe A (donc myColll représente cette liste d'objet B) et que le binding appliqué à ma list box correspond aussi à cette liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <TabItem x:Name="monTabItem" Padding="10" Header="Frais" DataContext="{Binding Path=monObjetA.MaListe}">
    <StackPanel>
    <ListBox SelectionChanged="ListBox1_SelectionChanged" Name="ListBox1" 
     IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=., Mode=TwoWay}" ItemTemplate="{DynamicResource MonTemplate}"></ListBox>
    .....
    <ComboBox x:Name="cbChoixAnnee" SelectedItem="{Binding Path=Annee, Mode=OneWay}" SelectionChanged="cbChoixAnnee_SelectionChanged">
    Mon objet B est donc bien mis à jour, mais graphiquement ma ListBox ne se met pas à jour. J'ai essayé

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ton code me semble, à priori, correct donc je pense plus que le problème vient de ta CollectionView....

    Mais même ca, rien ne le garantie

  12. #12
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Bon ben j'ai résolu mon problème autrement. Dans le Set de ma propriété Date de l'objet B, je met à jour ma SortedList de mon objet A (j'ai une référence à A dans B). Du coup ma ListBox se met à jour. Mais bon, c'est "cochon" je trouve.

    En fait je penses que le problème et qu'il ne "voit" pas les modif de _sortedList

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/06/2009, 21h41
  2. [WPF] Probléme de binding dans un UserControl :(
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 17/07/2008, 15h51
  3. [WPF] Problème de binding
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/02/2008, 14h08
  4. [WPF] Problème de binding entre une SortedList et une ListBox
    Par JuTs dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 10/12/2007, 13h20
  5. [WPF] Problème de binding
    Par JuTs dans le forum Framework .NET
    Réponses: 42
    Dernier message: 06/11/2007, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo