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 :

ObservableCollection<T> + mvvm Light


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de YodaOne
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 76
    Par défaut ObservableCollection<T> + mvvm Light
    Bonjour à tous,

    Je but sur un problème depuis plusieurs jours maintenant, je m'explique :
    je rempli un observablecollection<T> via nhibernate, cela fonctionne parfaitement, la navigation dans la collection fonctionne également temp que aucune modification de donnée n'a été faite. Dès que je modifie une valeur via le formulaire qui est binder par le selecteditem, la collection ne réagis plus,
    les valeurs du formulaire reste sur l'enregistrement modifié et si je change d'élément en cliquant sur le suivant où précédent l'erreur suivante apparaît : Un élément avec la même clé a déjà été ajouté.

    je précise que la classe de type T implément INotifyPropertyChanged

    Si quelqu'un à déjà rencontrer ce type de problème, je suis preneur

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Pourrais-tu fournir des éléments de code ? Comme par exemple :
    • Le binding dans ton XAML (ItemsSource et SelectedItem entre autre)
    • Un extrait de ton ViewModel avec entre autre : ta propriété sur laquelle est bindée le SelectedItem ainsi que ton observableCollection

  3. #3
    Membre éprouvé Avatar de YodaOne
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 76
    Par défaut
    Bonjour,

    Voici les différentes étapes:

    je bind le datacontext de mon usercontrol de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding CreateModifSuppliers, Source={StaticResource VmLocator}}"
    Ensuite, le usercontrol possède 2 grilles, une dans laquelle la listbox est stockée et la deuxième qui possède mais différent champ à afficher.

    la listbox est binder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox x:Name="listBx" HorizontalAlignment="Stretch" Margin="0,25,0,0" VerticalAlignment="Stretch" ItemsSource="{Binding Data, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" Style="{DynamicResource lsFournDataTemplate}">
    et la grille de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Grid DataContext="{Binding SelectedItem, ElementName=listBx, Mode=TwoWay}" Column="1">
    ça c'est pour la vue.
    Ensuite dans ma vuemodel:
    une propriété de type observablecollection<SuppliersMdl> est déclarée et remplie dans le constructeur du viewmodel grâce à ma couche donnée.
    Ma couche de donnée possède tout les models correspondant au table et celui que j'utilise pour cette vue est suppliersmdl qui hérite de InotifyPropertyChanged afin que l'ui soit informé des différents changement de valeurs.

    Maintenant au niveau de la conception, je vois pas se qui peux clocher.
    Je dois faire encore un test en dupliquant ma classe T "suppliersMdl" en la mettant dans la couche vue pour voir si le soucis ne viendrai pas de la.

    Merci d'avance

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Sans aller voir plus loin, je trouve très bizarre que tu ais mis un Binding TwoWay sur le ItemsSource de ta ListBox
    Je ne suis pas sûr que ça ne provoque pas quelque chose de bizarre.
    A ma connaissance, il n'y a pas de cas où tu as à utiliser un binding en mode TwoWay sur le ItemsSource d'un contrôle.

    Pourrais-tu me donner un extrait de code de ta manière d'implémenter INotifyPropertyChanged ? A moins que ton Model soit généré par Entity Framework Design First ou Database First (dans ce cas il le génère correctement)

    Il y a autre chose. A ta place, vu que tu utilises le pattern MVVM, je trouve étrange d'utiliser IsSynchronizedWithCurrentItem et de binder le DataContext de ta Grid sur le SelectedItem de ta ListBox.
    En gros ça veut dire que tu fais du MVVM, mais pas trop

    Si tu fais du MVVM, il ne faut pas utiliser (sauf si pas d'autres moyens) des références à des éléments graphiques dans un binding, mais plutôt des propriétés de ton ViewModel (je ne parle que de bindings qui permettent de lier l'UI à des objets métiers, pas des animations etc.)
    Donc dans ton cas, il te faut créer une propriété de ce style dans ton ViewModel

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private SuppliersMdl _SelectedSuppliersMdl;
    public SuppliersMdl SelectedSuppliersMdl
    {
    	get{return _SelectedSuppliersMdl;}
    	set
    	{
    		_SelectedSuppliersMdl = value;
    		this.NotifyPropertyChanged();
    	}
    }

    Ensuite dans le XAML, plutôt avoir ça

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox ItemsSource="{Binding Data}" SelectedItem="{Binding SelectedSuppliersMdl, Mode=TwoWay}" />

    et ça

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Grid DataContext="{Binding SelectedSuppliersMdl, Mode=TwoWay}">

  5. #5
    Membre éprouvé Avatar de YodaOne
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 76
    Par défaut
    Bonjour et merci Marcusien,

    Je vais faire les adaptations du code ce soir pour voir mais la propriété existe déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private SuppliersMdl _SelectedSuppliersMdl;
    public SuppliersMdl SelectedSuppliersMdl
    {
    	get{return _SelectedSuppliersMdl;}
    	set
    	{
    		_SelectedSuppliersMdl = value;
    		this.NotifyPropertyChanged();
    	}
    }
    Pour le Listbox => selecteditem, j'y avais pas penser

    Merci en tout cas pour les infos, je viens faire mon rapport dès que j'ai tester cela.

    Bonne journée

  6. #6
    Membre éprouvé Avatar de YodaOne
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 76
    Par défaut
    Voila,

    Après plusieurs tests, la solution à mon problème à été de mapper la classe persistent (modèle global) à la classe local (modèle client). Donc obliger de dupliquer ma classe pour que cela fonctionne correctement. Je sais pas si c'est la meilleur solution mais bon ....

    Pour ceux que cela intéresse un bon livre sur la pratique de mvvm + sgbd (MVVM, de la découverte à la maîtrise de Jonathan Antoine et Thomas Lebrun)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/02/2012, 21h52
  2. Réponses: 15
    Dernier message: 23/08/2011, 14h26
  3. [SL4]MVVM Light toolkit + Messenger
    Par chris81 dans le forum Silverlight
    Réponses: 2
    Dernier message: 20/07/2010, 09h04
  4. DataForm Template MVVM light
    Par pmorestin dans le forum Silverlight
    Réponses: 3
    Dernier message: 21/04/2010, 15h03

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