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

Dotnet Discussion :

[C# - .Net] MVVM : ListBox->ObservableCollection->List ?!


Sujet :

Dotnet

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 43
    Par défaut [C# - .Net] MVVM : ListBox->ObservableCollection->List ?!
    Bonjour,

    Dans le cadre d'un projet pour mon école, je dois réaliser un playerVideo en dotNet / C#.

    Dans la mesure du possible, mon prof attends du MVVM. J'ai regarde beaucoup d'exemples, et je pense avoir saisi les notions de bases, mais dans la pratique je me pose beaucoup de question.

    Je vais vous exposer un exemple de ce qui m'embete:

    Typiquement, dans mon player, je vais devoir afficher une playList. Si je suis la logique MVVM, je pensais architecturer sa de la manière suivante:

    -Vue (xaml): une List Box
    -ModelVue(cs): une observableCollection
    -Modele(cs): une classe "controlleur" playList

    Je pensais dans un premier temps binder ma ListBox sur l'observableCollection. (sa c'est fait). Ensuite vient la problematique de ma classe playList. Je pars du principe que je ne fait pas d'operations sur l'observable collection, elle n'a pour but que l'affiche de mes morceaux.

    Du coup, cela voudrait dire que pour mes operations (morceaux suivants, etc...) j'aurais une deuxieme liste dans ma classe playList? Dans ce cas est il possible de binder l'observableCollection sur la list contenue dans la classe playList, ou alors dois juste abonner mon observableCollection a des evenement tels que: "ajouter un morceau", "supprimer un morceau", "clear la liste"?

    Voila, j’espère que je n'ai pas ete trop confus dans mon développement. Qu'en pensez vous?

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Citation Envoyé par MedyAndFriends Voir le message
    Du coup, cela voudrait dire que pour mes operations (morceaux suivants, etc...) j'aurais une deuxieme liste dans ma classe playList? Dans ce cas est il possible de binder l'observableCollection sur la list contenue dans la classe playList, ou alors dois juste abonner mon observableCollection a des evenement tels que: "ajouter un morceau", "supprimer un morceau", "clear la liste"?
    Je pense que tu as dans l'ensemble bien crompris le pattern: le view model est un espèce d'adaptateur du modèle pour les besoins de la vue, pourque celle-ci soit simplement bindable au view model...

    Par contre pourquoi as-tu une deuxième liste dans ton modèle? Tu veux stocker les commandes sous forme de liste? Une commande est une action et peut simplement être implémentée comme une méthode!
    Et au niveau du viewmodel, tu peux la mapper à travers un ICommand que tu pourras aussi binder à partir de la vue (genre un bouton en général)

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 43
    Par défaut
    Salut, merci pour ta reponse.

    Non il ne s'agit pas d'une liste de commande que je voulais dans le modèle. J'ai besoin d'afficher une liste de lecture. Cette dernière est binder sur une observableCollection de mon ModelVue. Je me demandais simplement si je devais effectuer un traitement dessus directement, ou avoir une liste dans mon modèle qui effectuerait le traitement et se synchroniserait avec l'observable collection.

    J'ai plus ou moins resolu mon probleme:

    A l'initialisation du ModelVue, j'initialise une classe PlayerData (en singleton) a laquelle je donne en paramètre mon observable collection. C'est le playerData qui fait office de contrôle de la liste et qui ajoute/supprime des éléments.

    Je ne suis pas forcement satisfait de cette solution, mais je ne voyait pas comment faire autrement.

    Par contre, je me retrouve face a un nouveau probleme sur mon projet (un windows media player je le rappel). J'ai un MediaElement dans ma Vue. Ce dernier doit il rester dans ma vue ou doit il etre binder sur mon ModelVue?

    Actuellement, j'ai binder la source de ce mediaElement sur ma VueModele. Le probleme, c'est que pour passer au morceau suivant, le mediaElement doit interroger le Modele.

    Je pensait bind l'evenement 'MediaEnded' du mediaElement sur une methode de mon ModeleVue, mais sa n'a pas l'air d'etre possible...

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Attention le modèle est plus bas niveau que le view model. Le modèle ne devrait pas accéder au viewmodel, sinon autant mixer model et viewmodel (y'a plus d'intérêt!). (Le viewmodel "connait" le model, mais pas l'inverse)

    J'ai pas tout compris, mais MediaEnded peut être transformé en commande pour le passer au viewmodel. Si tu regardes des framework comme mvvmlight, il y a des outils pour transformer des event en commande.

    a+

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 43
    Par défaut
    Merci pour ta réponse, je suis en train de regarder comment je peux implémenter tout sa.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 43
    Par défaut
    Est ce que je peux déranger encore une fois?

    Voici mon code xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
     
    <Grid>
            <MediaElement  Height="184" HorizontalAlignment="Left" Margin="12,36,0,0"  x:Name="mediaElement1" VerticalAlignment="Top" Width="479" LoadedBehavior="Manual"  SourceUpdated="mediaElement1_SourceUpdated"  MediaOpened="mediaElement1_MediaOpened" UnloadedBehavior="Manual" Source="{Binding MediaSource}" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MediaEnded">
     
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </MediaElement>
    Si j'ai bien compris le liens que tu m'as donne, entre les balises EventTrigger,
    il faut placer la balise <Command> afin de "cast" mon event en ICommand. C'est bien sa?

    Seulement VisualStudio me sort l'erreur "the type command was not found" lorsque j'essaye de la placer a cette endroit.

    Si je place cette balise dans un bouton, cela fonctionne. Est ce qu'il me manque une reference ou alors ce n'est pas possible d'utiliser le mot clef command dans un MediaElement?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Non, ça ne sert pas à caster, mais apparemment dans l'exemple "Command:" est le namespace de la classe EventToCommand.
    Ce qu'il faut comprendre c'est que sur le trigger (eventtrigger) MediaEnded, on lance une commande (EventToCommand)....

Discussions similaires

  1. [Débutant] VB.net WPF : bonne pratique ? (Observablecollection List(of ) data binding)
    Par Gloubi99 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 01/06/2015, 13h26
  2. Réponses: 4
    Dernier message: 12/05/2006, 11h08
  3. [vb.net] [débutant] Listbox .
    Par Amenos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/02/2006, 14h26
  4. [VB.NET][ListView]des images dans une list view
    Par pcdj dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/12/2005, 12h08
  5. [VB.NET][PDA]Remplir 2 textbox par liste de valeurs
    Par tostinni dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/12/2005, 21h58

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