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] Détecter l'ajout d'un élément sur une liste


Sujet :

Silverlight

  1. #1
    Membre averti
    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
    Par défaut [MVVM] Détecter l'ajout d'un élément sur une liste
    Bonjour,

    Je développe actuellement une application en Silverlight 4 MVVM et je souhaiterais détecter l'ajout d'un élément, depuis ma vue, sur une liste dans le ViewModel.

    Je possède une ListBox dont la propriété ItemsSource est bindé à une liste dans mon ViewModel

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ListBox ItemsSource="{Binding Items}">
    	<ListBox.ItemTemplate>
    		<DataTemplate>
    			<!-- ... -->
    		</DataTemplate>
    	</ListBox.ItemTemplate>
    </ListBox>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private ObservableCollection<Item> _items = new ObservableCollection<Item>();
    public ObservableCollection<Item> Items
    {
    	get { return _items; }
    	set
    	{
    		_items = value;
    		RaisePropertyChanged("Items");
    	}
    }
    Lorsqu'un item est ajouté à ma listbox (depuis la vue), j'aimerais le détecter depuis ma viewmodel afin d'effectuer une action spécifique. Cependant, je ne trouve pas comment faire.
    Quelqu'un a-t-il une idée ?

    Merci par avance.

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Tu peux t'abonner à l'évènement CollectionChanged de l'ObservableCollection

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Lorsqu'un item est ajouté à ma listbox (depuis la vue)
    Euh... comment au juste ? La ListBox ne permet pas à l'utilisateur d'ajouter un élément, seul toi peut le faire, par le code. Donc le contenu de la ListBox ne sera jamais modifié par la vue, c'est toujours le ViewModel qui fera le travail

  4. #4
    Membre averti
    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
    Par défaut
    Citation Envoyé par meziantou Voir le message
    Tu peux t'abonner à l'évènement CollectionChanged de l'ObservableCollection
    Malheureusement, ça ne fonctionne pas. Je ne sais pas pourquoi, mais ma collection n'est pas mise à jour lorsqu'un item est ajouté à la liste. Pourtant, j'ai bien spécifié le mode TwoWay.

    Citation Envoyé par tomlev Voir le message
    Euh... comment au juste ? La ListBox ne permet pas à l'utilisateur d'ajouter un élément, seul toi peut le faire, par le code. Donc le contenu de la ListBox ne sera jamais modifié par la vue, c'est toujours le ViewModel qui fera le travail
    J'ai pris le cas d'une listbox pour simplifier l'exemple. Il s'agit en fait d'un planning (contrôle d'une librairie tierce) sur lequel je bind des évènements. Depuis ce planning, il est possible d'ajouter un évènement et j'aimerais pouvoir le récupérer depuis mon ViewModel.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est quoi le contrôle en question ? DevExpress, Telerik, autre ?

  6. #6
    Membre averti
    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
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est quoi le contrôle en question ? DevExpress, Telerik, autre ?
    SyncFusion

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Et il n'y a pas un évènement sur ce contrôle qui te permettrait d'avoir accès à l'info que tu souhaites ?

  8. #8
    Membre averti
    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
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Et il n'y a pas un évènement sur ce contrôle qui te permettrait d'avoir accès à l'info que tu souhaites ?
    Si, je peux toujours accéder à la propriété Items de ce contrôle depuis le code-behind pour récupérer les derniers éléments ajoutés, mais dans ce cas ce n'est plus du MVVM.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre, je n'ai vu aucun évènement qui semble convenir dans la doc... D'ailleurs la doc de ces contrôles est vraiment toute pourrie

    Si le truc est bien foutu, il devrait suffire de binder ItemsSource pour que les ajouts/suppressions soient propagés dans les 2 sens, mais apparemment ce n'est pas le cas.

  10. #10
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Citation Envoyé par Digilougm Voir le message
    Si, je peux toujours accéder à la propriété Items de ce contrôle depuis le code-behind pour récupérer les derniers éléments ajoutés, mais dans ce cas ce n'est plus du MVVM.
    Il ne faut pas être si intégriste. Si le seul moyen pour le contrôle de notifier l'ajout d'un nouvel élément est de passer par un évènement (faut lire la doc du contrôle pour en être sur), bin tu n'as pas trop le choix.
    Tu t'abonnes à l'évènement et coté code behind de la vue tu appelles le ViewModel avec un truc du genre ViewModel.AddNewItem(newItem).
    Il y a aussi un behavior dans le MVVM Light Toolkit, EventToCommand, qui pourrait être intéressant.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  11. #11
    Membre averti
    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
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Il ne faut pas être si intégriste. Si le seul moyen pour le contrôle de notifier l'ajout d'un nouvel élément est de passer par un évènement (faut lire la doc du contrôle pour en être sur), bin tu n'as pas trop le choix.
    Tu t'abonnes à l'évènement et coté code behind de la vue tu appelles le ViewModel avec un truc du genre ViewModel.AddNewItem(newItem).
    Il y a aussi un behavior dans le MVVM Light Toolkit, EventToCommand, qui pourrait être intéressant.
    Effectivement, je crois que je vais me résigner à passer par les évènements et le code-behind.

    Merci à tous pour votre aide

Discussions similaires

  1. [Débutant] Ajouter un nouvel élément dans une liste à partir d'un formulaire
    Par pliza dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 27/08/2014, 18h05
  2. [TPW] Erreur lors de l'ajout d'un élément dans une liste chaînée triée
    Par sangimed dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 18/01/2013, 21h37
  3. Ajouter des Droit NTFS sur une liste de dossiers
    Par minidoux24 dans le forum VBScript
    Réponses: 4
    Dernier message: 29/09/2010, 11h56
  4. Réponses: 1
    Dernier message: 31/05/2009, 22h29
  5. Réponses: 1
    Dernier message: 18/05/2009, 16h51

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