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 :

[MVVM] Binding TwoWay sur une combobox


Sujet :

Silverlight

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 23
    Points
    23
    Par défaut [MVVM] Binding TwoWay sur une combobox
    Bonjour,

    Je rencontre actuellement un problème de binding sur une combobox. Celle-ci affiche une liste de catégories d'utilisateur. Je souhaite que la valeur sélectionnée dans cette combobox soit-celle de la catégorie d'un utilisateur sélectionné dans une listbox. Voici le code (volontairement simplifié) :

    Dans ma vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox SelectedItem="{Binding SelectedUser, Mode=TwoWay}" ItemsSource="{Binding Users}" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ComboBox SelectedItem="{Binding SelectedUser.CategorieUtilisateur, Mode=TwoWay}" ItemsSource="{Binding UserCategories}"  />
    Dans mon ViewModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private Utilisateur _selectedUser;
    public Utilisateur SelectedUser
    {
    	get { return _selectedUser; }
    	set
    	{
    		_selectedUser = value;
    		RaisePropertyChanged("SelectedUser");
    	}
    }
    Dans ma listbox, un template est défini et affiche notamment la catégorie de l'utilisateur. Lorsque, depuis la combobox, je sélectionne une catégorie, alors le binding est effectué et la catégorie est mise à jour dans la ListBox. En revanche, lorsque l'utilisateur sélectionné dans la listbox change, aucune répercussion n'est faite sur sur la combobox.

    J'ai également essayé de bindé directement sur le SelectedItem de la listBox, c'est-à-dire sans passer par le ViewModel, mais le problème reste le même.

    Savez-vous d'où peut venir le problème ?

    Merci par avance.

  2. #2
    Membre habitué Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Points : 143
    Points
    143
    Par défaut
    Le SelectedItem doit forcément faire parti d'un élément de ton ItemsSource.
    Ici, en mémoire, le SelectedUser.CategorieUtilisateur ne correspond à aucun élément de la liste des UserCategories.

    Pour pallier à ton soucis, la ComboBox possède une propriété SelectedValue. Ca permet de pointer non pas sur un objet (référence en mémoire) mais sur un identifiant unique.

    Dans ton cas, ça donne quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ComboBox SelectedValue="{Binding SelectedUser.CategorieUtilisateur.CategorieId, Mode=TwoWay}" 
    SelectedValuePath="CategorieId"
    ItemsSource="{Binding UserCategories}"  />
    Pour plus d'infos : http://johnpapa.net/binding-to-silve...playmemberpath.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Effectivement, ça marche, sauf que du coup le problème est inversé. Le binding de la combobox vers la listbox fonctionne, mais l'inverse non.

  4. #4
    Membre habitué Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Points : 143
    Points
    143
    Par défaut
    En effet, j'avais zappé la sélection dans la ListBox ...
    Tu peux tenter de mixer les propriétés SelectedValue et SelectedItem, mais je déconseille, ça peut être tortueux.

    Le plus simple serait de modifier le SelectedUser.CategorieUtilisateur au moment de l'update.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Qu'est-ce que tu entends par "modifier le SelectedUser.CategorieUtilisateur au moment de l'update." ? Si c'est déclencher l'évènement onPropertyChanged sur SelectedUser.CategorieUtilisateur, je l'ai déjà fait, et ça ne change rien au problème.

  6. #6
    Membre habitué Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Points : 143
    Points
    143
    Par défaut
    Mmm, dans ce cas tu peux créer une propriété "SelectedCategory" dans ton ViewModel, binder le SelectedItem de ta ComboBox dessus, puis à chaque modification de la propriété (i.e. dans le setter de SelectedCategory), tu mets à jour ton SelectedUser.CategorieUtilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <ComboBox SelectedItem="{Binding SelectedCategory, Mode=TwoWay}"
    ItemsSource="{Binding UserCategories}"  />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private Catagory _selectedCategory;
    public Catagory SelectedCategory
    {
    	get { return _selectedCategory; }
    	set
    	{
    		_selectedCategory= value;
    		RaisePropertyChanged("SelectedCategory");
     
                    // On assigne la catégorie à l'utilisateur courant
                    this.SelectedUser.CategorieUtilisateur = value;
    	}
    }

Discussions similaires

  1. Binding sur une combobox
    Par duaner dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/08/2009, 15h48
  2. [Binding] Comment le faire fonctionner TwoWay sur une Collection<String> ?
    Par matdur dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 22/04/2009, 11h39
  3. Probleme vaudou sur une combobox
    Par sabotage dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/07/2007, 16h32
  4. evenement keypress sur une combobox
    Par ashash dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/07/2007, 22h01
  5. Test sur une ComboBox (Liste déroulante).
    Par SeaWolf601 dans le forum IHM
    Réponses: 5
    Dernier message: 05/10/2006, 17h29

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