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 :

ObjectDataProvider : pb MAJ de l'affichage


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut ObjectDataProvider : pb MAJ de l'affichage
    j'ai besoin d'un petit tracer pour mon appli.

    j'ai fait une classe "CTraceList" qui hérite de list<string>, où j'ajoute des messages formatés depuis différentes taches et objets de mon code.

    Ensuite j'ai une ListBox sur ma fenêtre principale sensée afficher le contenu de la liste ( citée ci-dessus ). j'ai mis dans Window.Resources un odp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ObjectDataProvider x:Key="CTraceList" ObjectInstance=""/>
    puis pour ma LB j'ai configuré le item source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <ListBox x:Name="Tracer"
    	ItemsSource="{Binding Source={StaticResource CTraceList} }"  />
    enfin à l'init je configure l'instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ObjectDataProvider odpGroup = FindResource("CTraceList") as ObjectDataProvider;
    if (odpGroup != null)
    {
          odpGroup.ObjectInstance = <monObject>;
    }
    Mon problème est que la list box n'est rafraichie que lorsque je redimensionne la colonne de la grille qui la contient ... j'en conclu qu'il me manque un truc au niveau de la mise à jour !

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Tu dis à l'init ? C'est dans le constructeur ou dans l'évènement Loaded ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    Tu dis à l'init ? C'est dans le constructeur ou dans l'évènement Loaded ?
    constructeur ... exactement juste après le InitializeComponent

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Essaye d'utiliser une ObservableCollection<string> plutôt qu'une List<string>


    Au pire, tu peux essayer d'appeler toi-même la méthode Update de ton ODP

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Essaye d'utiliser une ObservableCollection<string> plutôt qu'une List<string>
    moué ca marche ... le prob est que ma liste est dans une DLL qui n'a rien a voir avec l'IHM => la référence sur windowsBase.dll .. pas top

    Citation Envoyé par Thomas Lebrun Voir le message
    Au pire, tu peux essayer d'appeler toi-même la méthode Update de ton ODP
    Dans ce cas, le problème est de savoir quand !

    Ce qui m'inquiète dans cette histoire est que j'ai une série de dictionnaires mis à jour par un serveur (via une socket) et bindés sur des Lists Box ... et là je peux pas utiliser un ObservableCollection ...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    ben tu peux toujours implementer les
    INotifyCollectionChanged, INotifyPropertyChanged
    en general ca regle les problemes

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par jnussas Voir le message
    moué ca marche ... le prob est que ma liste est dans une DLL qui n'a rien a voir avec l'IHM => la référence sur windowsBase.dll .. pas top
    Certes, mais de toute façon, cette DLL sera chargée par l'application WPF donc elle sera déjà loadé en mémoire: l'utiliser dans un autre projet ne présente, dans ce cas, pas ou peut de risques/pb

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par ikeas Voir le message
    ben tu peux toujours implementer les
    INotifyCollectionChanged, INotifyPropertyChanged
    en general ca regle les problemes
    Il faudrait qu'il implémente ces interfaces sur les classes string et List<T> et ca, il ne peut pas le faire

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    a mon avis ca doit etre possible mais il faut
    surcharger un max de methode comme le Add
    et rajouter le mapping des events pours tous les items

    mais bon je peux me tromper aussi

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pour List<T>, il devrait créer une classe qui en hérite et implémenter INotifyCollectionChanged: ca peut se faire.

    Par contre, pour string et INotifyPropertyChanged, ce n'est pas possible (à moins qu'on m'expliquer comment hériter d'une classe scellée, en .NET )

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    oui c'est vrai a moins de faire une heritage pas possession mais c'est plus complexe

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut


    Pour mon tracer, une observable collection est une solution rapide et qui marche.

    Pour mes dictionnaires c'est une autre histoire. j'ai quelques dictionnaires implémentés de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class CMyObjectDictionary : Dictionary<string, CMyObject>
    ceux-ci sont bindés sur des list box via un ODP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ObjectDataProvider x:Key="CMyObjectDictionary" ObjectInstance=""/>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ListBox x:Name="LBGroups" Width="Auto" Height="138"
        IsSynchronizedWithCurrentItem="True" 
        ItemsSource="{Binding Source={StaticResource CMyObjectDictionary } }"
        Style="{DynamicResource ListBoxStyle}" DockPanel.Dock="Top" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Key}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    et bien sur le meme code dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ObjectDataProvider odpGroup = FindResource("CMyObjectDictionary ") as ObjectDataProvider;
      if (odpGroup != null)
      {
        odpGroup.ObjectInstance = ((AMClientWpf.App)Application.Current).m_amClient.m_DataModel.m_oMyObjectList;
      }
    Mise à part mon problème de refresh ... j'ai bien dans ma LB la liste des clefs de mon dictionaire ...

    J'ai donc ajouté le INotifyCollectionChanged au niveau de mon implem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        public class CMyObjectDictionary : Dictionary<string, CGroup>, INotifyCollectionChanged
    avec toute la gestion de l'event associé
    mon event se déclenche bien et est bien récup par l'ihm !!!
    MAIS il n'y a plus rien dans la LB

    j'en ai marre, une solution ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Essaye d'implémenter INotifyCollectionChanged plutôt que INotifyPropertyChanged

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Essaye d'implémenter INotifyCollectionChanged plutôt que INotifyPropertyChanged
    euh ........ c'est ce que j'ai fait ... non ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il me semblait avoir lu que tu avais implémenté INotifyPropertyChanged


    Bon, sinon, essaye aussi d'implémenter cette interface sur CMyObject et CGroup.

    Mais c'est pas clair car un coup, tu marques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class CMyObjectDictionary : Dictionary<string, CMyObject>
    Et après:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class CMyObjectDictionary : Dictionary<string, CGroup>

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    je voulais juste pas montrer mon implem' mais j'ai pas fait le remplacement partout ( CGroup <=> CMyObject )

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Si je vous donnais la réponse vous me croiriez pas.

    Je suis revenu à la source du problème : Dictionary n'informe pas l'ihm ...
    a/ il faut l'informer => INotifytrucchmut mais bordel dans le code et au final pas mieux

    b/ Le problème est le Dictionnary mais ObservableCollection marche ... On essaye ObservableDictionary => ca existe pas
    mais en fait un dicto c'est quoi une collection de paire cle/valeur qu'a cela ne tienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class ObservableDictionary<T> : ObservableCollection<KeyValuePair<string, T>>
    bon après il faut ajouter le add, remove, clear, containsKey ... and so on

    mais c'est tombé en marche

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

Discussions similaires

  1. Pb Affichage Sous form après Maj form
    Par Maxsen dans le forum VBA Access
    Réponses: 5
    Dernier message: 28/02/2008, 12h54
  2. [AJAX] [MSIE][DOM] MAJ de l'affichage
    Par yjuliet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/06/2007, 11h44
  3. Réponses: 2
    Dernier message: 15/05/2007, 12h25
  4. Réponses: 8
    Dernier message: 27/12/2006, 23h51
  5. [MFC] [POCKET PC] Pb maj affichage.
    Par Yellowmat dans le forum MFC
    Réponses: 9
    Dernier message: 12/10/2005, 06h51

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