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

Silverlight Discussion :

Mise à jour observablecollection impossible (Ria / MVVM light)


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par défaut Mise à jour observablecollection impossible (Ria / MVVM light)
    Bonjour à tous !

    Une petite question de débutant.
    J'ai du mal à saisir l'utilisation de la notification de changement entre view et viewModel (ou j'ai un simple soucis de code ).

    Le décor :

    J'ai une comboBox alimentée par une collection récupérée d'une bd via RIA (la table est toute bête : 1 code + un nom).
    Je dispose d'un bouton permettant la modification des éléments de cette liste dans la bd qui ouvre une childWindow.

    La ChildWindow dispose d'une datagrid, d'un textBox, d'un bouton Ajouter, d'un bouton mettre a jour la base.

    Si je modifie un élément de ma datagrid et que je lance la MAJ de la base, pas de soucis. C'est déjà ça ... !

    Mon problème, c'est le textBox et son bouton Ajouter. Lorsque je saisie un nouvel item dans le TB et que je clique sur Ajouter, Il n'est pas visible dans ma datagrid ... Mais le contexte a bien pris en compte qu'il y avait une modif (le bouton de MAJ n'est actif que s'il y a eu modif du contexte et si je lance la MAJ de la base, le nouvel item est bien enregistré).

    Voici la commande liée au bouton Ajouter :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      private void CreateCiteAntiques(string _cite)
            { 
                CiteAntiques cite = new CiteAntiques();
                cite.nomCiteAntique=_cite;
                _Context.CiteAntiques.Add(cite); // Met à jour le contexte de données
               // _ListeCitesAntiques.Add(cite); // (Test) Met à jour la liste affichée dans la view.
                CiteAntique = null; // réinit TB de saisie.
                RaisePropertyChanged("ListeCiteAntiques");
     
            }
    ListeCiteAntiques est l'observableCollection (une collection de CiteAntiques).

    Voici son implémentation sur la view.

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
            <sdk:DataGrid  AutoGenerateColumns="False" Height="170" HorizontalAlignment="Left" Margin="23,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="150" DataContext="{Binding}" ItemsSource="{Binding Path=ListeCiteAntiques, Mode=TwoWay}" Visibility="Visible">


    Quelqu'un aurait une idée de là ou je bloque ? Car c'est à l'évidence moi qui ne comprends pas un truc, là ... !!

    Merci d'avance !
    Frédéric

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Salut,

    Si j'ai bien compris tu te plains du fait que ta combo ne soit pas mise à jour, alors qu'elle est bindée sur ListeCiteAntiques (qui est une observable collection)....

    Je crois que c'est simplement un problème de compréhension du rôle d'une observablecollection.
    Tu confonds:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RaisePropertyChanged("ListeCiteAntiques");
    qui va notifier à la combobox que l'élément sur lequel elle est bindée a changé

    Et l'utilisation des mécanismes de notification (évènement CollectionChanged) de l'observablecollection qui servira à ce que ton control list (combobox dans ton cas) soit prévenu de quel élément à été change/modifié/supprimé...

    Dans ton cas il faudrait donc à un moment faire un appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeCitesAntiques.Add(cite);


    A+

  3. #3
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par défaut
    Bonjour ChrisDot et merci pour ta réponse.

    C'est bien ce que je pensais. Il y a bien quelque chose que je ne saisis pas !

    Le fait de réaliser un ajout au contexte n'est donc pas suffisant à provoquer la MAJ de l'observableCollection ??

    PS : Désolé pour le délai de réponse ... Mais je ne reçois pas les alertes ...

    Je vais regarder de plus prêt mes paramètres !

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Non de base, ton EntitySet<> et ton ObservableColletion de sont pas liées...
    Il existe des évènements (EntityAdded par exemple) sur ton EntitySet qui te disent ce qui change, mais je sais pas si c'est plus simple de faire un wrapper ou autre couche qui lie les 2.
    Le plus simple c'est de l'ajouter dans les 2 simultanément.

  5. #5
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par défaut
    Merci pour l'éclairage !

    Je vais donc réactiver la ligne dont je pensais n'avoir pas besoin ...

    Donc, lors de l'enregistrement de mon nouvel item, j'aurais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     private void CreateCiteAntiques(string _cite)
            { 
                CiteAntiques cite = new CiteAntiques();
                cite.nomCiteAntique=_cite;
                _Context.CiteAntiques.Add(cite); // Met à jour le contexte de données
               ListeCitesAntiques.Add(cite); // Met à jour la liste affichée dans la view.
                CiteAntique = null; // réinit TB de saisie.
                // RaisePropertyChanged("ListeCiteAntiques");
     
            }
    RaisePropertyChanged n'est donc utilisé que lors de la notification depuis la collection vers la vue. MAIS alors, comment ce fait-il que si je place le dernier RaisePropertyChanged de ma fonction d'ajout en commentaire, la MAJ est quand même transmise à la vue ??

    Désolé d'être aussi pointilleux (d'autres diraient lourd) ...


    Merci au passage d'avoir reformaté mon premier message

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Citation Envoyé par SIC83 Voir le message
    Merci pour l'éclairage !
    RaisePropertyChanged n'est donc utilisé que lors de la notification depuis la collection vers la vue. MAIS alors, comment ce fait-il que si je place le dernier RaisePropertyChanged de ma fonction d'ajout en commentaire, la MAJ est quand même transmise à la vue ??
    RaisePropertyChanged est à utiliser si tu changes complètement ta liste (tu réinstancies une liste), c'est pareil que quand tu réaffectes un chamsp texte par exemple...
    Ca marche aussi parce que le combo comprend que tout a changé ! Sur des petites liste ça passe, mais sur de plus grandes, c'est mieux de lui indiquer uniquement ce qui a changé, et c'est la valeur ajoutée des observablecolletcion<>. Ces listes envoient des évènements qui disent ce qui a spécifiquement changé (ajout/delete/update d'un champ). Voir l'évènement CollectionChanged de l'observablecollection qui renvoie des NotifyCollectionChangedEventArgs, avec notament une propriété action.

    A+

  7. #7
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Par défaut
    Je commence à cerner la chose !

    Merci à toi pour ta disponibilité ChrisDot !


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

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/02/2013, 10h23
  2. [AC-2003] Ouverture Excel : mise à jour liaison impossible
    Par yael44 dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2010, 12h20
  3. Mise à jour firefox impossible
    Par guyle12 dans le forum Firefox
    Réponses: 1
    Dernier message: 21/12/2009, 20h40
  4. [WD-2007] Mise à jour renvoi impossible
    Par bridego dans le forum Word
    Réponses: 7
    Dernier message: 04/12/2009, 10h09
  5. glisser déposer après mise à jour java impossible
    Par moussetache dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/12/2008, 21h57

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