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 :

[MVVM] Pb de binding dynamique d'un bouton associé à un élément du masterViewModel


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut [MVVM] Pb de binding dynamique d'un bouton associé à un élément du masterViewModel
    Bonjour tout le monde,

    je travaille sur une application en WPF et j'utilise le pattern MVVM que je viens de découvrir.

    J'ai donc pris l'exemple de l'article écrit par Jérémy Alles, et je l'ai adapté à mon projet.
    J'ai une liste de fournisseurs et de produits (pour chaque fournisseur) dans le MasterViewModel. Ces listes sont des ObservableCollection.
    De plus, je déclare des ICollectionView pour chacun de mes éléments (objets) comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this.fournisseurCollectionView = CollectionViewSource.GetDefaultView(this.fournisseurs);
                if (this.fournisseurCollectionView == null)
                    throw new NullReferenceException("fournisseurCollectionView");
     
                this.fournisseurCollectionView.CurrentChanged += new EventHandler(this.OnCollectionViewCurrentChangedFournisseur);
    J'ai également des commandes associées aux traitements que je veux réaliser. Exemple : vendre un produit. J'ai donc la commande "commandVendreProduit".
    Dans la vue, je voudrais créer dynamiquement des boutons (personnalisés), et leur associer un fournisseur. Une fois que je clique sur un fournisseur, je dois afficher sa liste de produits (en passant pas "SelectedFournisseur" qui est de type FournisseurViewModel). Seulement voila, le SelectedFournisseur comporte toujours le premier élément de mon ObservableCollection fournisseurs. De même pour les produits...
    je n'arrive pas à récupérer le frs ou le produit sur lequel je clique.

    a l'affichage des produits je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UniformGrid gr = (UniformGrid)this.FindName("screen");
                gr.Children.Clear();
                gr.DataContext = ms.Produits;
     
                //ObservableCollection<ProduitViewModel> colPrd = ms.Produits;
     
                FournisseurViewModel leFournisseur = ms.SelectedFournisseur;
    Note: ms est une instance de MasterViewModel

    Puis quand je clique sur un produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ((Bouton)sender).DataContext = ms.SelectedProduit;
     
     
                        ms.CommandVendreProduit.Execute((ProduitViewModel)((Bouton)sender).DataContext);
    Je vais bien dans la méthode VendreProduit() mais le selectedProduit est toujours le premier de la liste du MasterViewModel et pas celui sur lequel j'ai cliqué...

    Auriez-vous une idée pour régler ce problème ?

    Merci beaucoup!
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Dans ta méthode OnCollectionViewCurrentChangedFournisseur, tu appelles bien la méhode permettant de lancer l'event PropertyChanged ?

  3. #3
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Oui...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void OnCollectionViewCurrentChangedFournisseur(object sender, EventArgs e)
            {
                OnPropertyChanged("SelectedFournisseur");
            }
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Par défaut
    Salut,

    Je suis l'auteur du tutoriel en question Je suis pas certain de bien avoir compris ton soucis. Quelques questions:

    • quand tu dis "quand je clique sur un produit", tu as un event sur le Click ou tu utilises une commande ? la deuxième solution me semble plus propore...
    • en utilisant une commande, tu pourrai mettre un paramètre avec, quelque chose du genre: Command={Binding CommandVendre}, CommandParameter={Binding}...
    • pour récupéré l'item courant, tu peux aussi utiliser ICollectionView.CurrentItem

    Si tu peux nous filer un projet d'exemple on pourra regarder plus en détails...

  5. #5
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Citation Envoyé par Jérem22 Voir le message
    Je suis l'auteur du tutoriel en question
    Il est très bien fait ! merci !
    Citation Envoyé par Jérem22 Voir le message

    • quand tu dis "quand je clique sur un produit", tu as un event sur le Click ou tu utilises une commande ? la deuxième solution me semble plus propore...
    J'utilise les deux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void unBouton_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
       Produit prod = new Produit();
     
       ProduitViewModel prodVM = new ProduitViewModel((ProduitViewModel)((Bouton)sender).DataContext);
     
       //ms.SelectedProduit = prodVM;
       ms.CommandVendreProduit.Execute(prodVM);
    Citation Envoyé par Jérem22 Voir le message

    • en utilisant une commande, tu pourrai mettre un paramètre avec, quelque chose du genre: Command={Binding CommandVendre}, CommandParameter={Binding}...
    Impossible parce que j'utilise le xaml pour afficher plusieurs listes (fournisseurs et produits). Je ne fais donc pas le binding dans le xaml mais dans le cs (dynamiquement).
    Citation Envoyé par Jérem22 Voir le message

    • pour récupéré l'item courant, tu peux aussi utiliser ICollectionView.CurrentItem
    Je l'utilise aussi. Si j'ai bien compris, le selectedProduit doit etre lié au currentItem de la collectionViewProduits ?

    Citation Envoyé par Jérem22 Voir le message
    Si tu peux nous filer un projet d'exemple on pourra regarder plus en détails...
    Mon projet est exactement comme le projet de ton article, a part que je fais tous les bindings en dynamqiue et non dans xaml.

    Merci !!
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Par défaut
    Je comprends pas ce que tu veux dire par "je fais tous les bindings en C#". Pourquoi tu as besoin de faire comme ça ? Idéalement, il faudrait faire le maximum de chose en XAML :p

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2009, 17h55
  2. Ajouter un contrôle dynamique contenant des boutons
    Par koukoula dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/06/2008, 11h58
  3. Réponses: 6
    Dernier message: 08/08/2006, 11h19
  4. Ajouter objet dynamiquement via un bouton
    Par maxjaco dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 23/06/2006, 16h39
  5. [VB.Net] Comment créer dynamiquement un contrôle bouton ?
    Par robert.michel9 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/01/2006, 13h49

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