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 - 1ère utilisation rafraichissement view OK - 2ème KO [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Analyste programmeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut ObservableCollection - 1ère utilisation rafraichissement view OK - 2ème KO
    Bonjour,

    J'ai un soucis avec l'utilisation d'une ObservableCollection que je n'arrive pas a expliquer, peut-être que quelqu'un pourra m'éclairer sur le sujet.

    Pour faire simple voici le contexte :

    J'ai une liste de produit, je peux afficher le détail de mon produit et sur certain produit je peux rattacher des produits.

    En gros dans mon objet Produit j'ai cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Produit
    {
        ...
        public List<Produit> lComposition { get; set; }
    }
    Le scénario se déroule ainsi :

    1 - J'affiche ma liste de produit.
    2 - Je sélectionne un produit quelconque.
    3 - J'ajoute un produit qui va composer mon produit (dans lComposition). Pour ce faire, j'ouvre une nouvelle View avec la liste de mes produits et le sélectionne.
    Résultat : Affichage de mon produit dans mon ObservableCollection dans la vue OK
    4 - Je ferme la fenêtre de mon produit et vais sur un nouveau produit.
    5 - Je fais la même manipulation qu'en 3 - et là :
    Résultat : KO la liste n'est pas jour dans la View.

    Mon ObservableCollection :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            public ObservableCollection<CompositionProduit> lCompositionProduit 
            { 
                get 
                {
                    _lCompositionProduit.Clear();
                    if (_oProduit != null)
                        foreach (CompositionProduit c in _oProduit.lCompositionProduit)
                            _lCompositionProduit.Add(c);
                    return _lCompositionProduit;
                }
            }

    Si quelqu'un a une idée de ce qui peut clocher ça m'aiderait beaucoup.

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Ce n’est pas très clair pour moi ; quand tu dis que la liste n’est pas mise à jour, on parle de quelle liste ? La liste lComposition de Produit ou l’ObservableCollection lCompositionProduit de la VM ?

    Dans le premier cas, peut-être simplement remplacer List<Produit> par ObservableCollection<Produit> ?

    Un poil plus de code et une reformulation du problème aiderait je pense.
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Analyste programmeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Tout d'abord merci de la réponse.

    J'ai mis sur mon objet Produit une ObservableCollection pour lCompositionProduit comme tu m'as préconisé. Cela ne fonctionne tout de même pas. Je vais pour le moment laisser cela pour faciliter la suite.

    J'ai testé plus en détail et en fait le problème vient déjà du produit que j'affecte dans mon ViewModel.

    Voici le code qui me permet d'ouvrir la fenêtre du détail de produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private static ProduitDetailView _viewDetailProduit;
            public static void AfficherDetailProduit()
            {
                Mediator.Register("FermerProduitDetail", FermerFenetre);
                if (_viewDetailProduit == null || !_viewDetailProduit.IsVisible)
                {
                    _viewDetailProduit = new ProduitDetailView();
                    _viewDetailProduit.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
                    _viewDetailProduit.Show();
                }
                _viewDetailProduit.Focus();
            }
    L'ouverture via le ViewModel de la liste des produits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                            GestionFenetre.AfficherDetailProduit();
                            if (OnAfficherProduit != null)
                            {
                                AfficherProduitEventArgs args = new AfficherProduitEventArgs();
                                args.oProduit = DAL_Produit.Obtenir(((parametre as Array).GetValue(0) as ProduitAffichable).Identifiant);
                                OnAfficherProduit(this, args);
                                OnPropertyChanged("NombreProduit");
                            }
    Une fois le détail ouvert, je déclenche l'événement "OnAfficherProduit".

    Il s'agit de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void _ProduitChanged(Object sender, AfficherProduitEventArgs e)
            {
                leProduit = e.oProduit;
            }
    Cela me permet d'affecter à mon objet Produit qui est affiché sur la View de la fenetre de détail du produit le produit sélectionné dans la liste.


    Le problème ce produit lorsque je souhaite ajouter des élements à lCompositionProduit à partir de la deuxième ouverture d'un détail de produit (la première fenetre de détail de produit est forcément fermé car en modal).
    Lors du pas-à-pas dans _ProduitChanged j'ai bien le bon produit qui s'affecte à "leProduit". Une fois que j'ajoute un produit dans lCompositionProduit, si je fais du pas-à-pas dans le code suivant, je me retrouve avec l'ancien produit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void SelectionProduit(object args)
            {
                if (args is int)
                {
                    leProduit.lCompositionProduit.Add(new CompositionProduit { oProduit = DAL_Produit.Obtenir((int)args), Quantite = 1 });
                }
            }
    Je sais pas si je suis assez clair... désolé..

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Analyste programmeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    J'essais de trouver des raisons à ce problème.

    Cela pourrait t'il venir d'un soucis sur le ViewModel suite à l'ouverture l'une après l'autre de ma fenêtre de détail de produit ?
    Sachant que je fais uniquement un 'Close' sur ma vue avant de l'ouvrir à nouveau.

  5. #5
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Pour que les valeurs se rafraichissent il faut que ton CompositionProduit implémente le IPropertychanged.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Analyste programmeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    En fait j'ai mis lCompositionProduit en ObservableCollection.

    Mais le problème ce situe plus en amont en fait. Il s'agit carrément de mon objet Produit dans mon ViewModel qui reprend l'ancienne valeur de la première View (Détail produit) dans ma seconde View de détail de produit.

    Bizarre dans le constructeur de la View le Produit est le bon. Ensuite dès que je suis dans une méthode dans le View si je fais du pas-à-pas je me rends compte que l'objet Produit est celui de la première fenêtre de détail de produit que j'avais précédemment ouverte.

    Merci.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Analyste programmeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Pour information j'ai résolu mon problème.

    Cela provenait du "Mediator" que j'utilisais pour transmettre l'information d'ajout d'un produit dans la composition.

    Je suppose que le Mediator avait en référence la premier ViewModel ouvert ?
    Bref j'ai fais quelque modification pour moins utiliser ce principe là.

    Maintenant j'ouvre la View contenant la liste des produits de cette manière et utilise un objet de retour (où là ce qui m'intéresse c'est le résultat qui est l'identifiant du produit) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            public static int AfficherProduitsModal()
            {
                RetourResultat oRetour = new RetourResultat();
                if (_viewProduitsModal == null || !_viewProduitsModal.IsVisible)
                {
                    _viewProduitsModal = new ProduitView(true, oRetour);
                    _viewProduitsModal.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
                    _viewProduitsModal.ShowDialog();
                }
                return oRetour.Resultat;
            }

    Code behind de la View :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            public ProduitView(bool pModeSelection, RetourResultat pResultat)
            {
                InitializeComponent();
                this.DataContext = new ProduitViewModel(pModeSelection, pResultat);
            }

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/04/2008, 13h42
  2. Bonita : 1ère utilisation
    Par TonyTHOMAS dans le forum JOnAS
    Réponses: 1
    Dernier message: 13/07/2007, 10h06
  3. [Visual Web] Utilisation des views plutôt que des tables
    Par eponette dans le forum NetBeans
    Réponses: 1
    Dernier message: 16/03/2007, 20h41
  4. Réponses: 1
    Dernier message: 03/02/2007, 18h02
  5. Réponses: 6
    Dernier message: 16/11/2005, 13h12

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