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 :

DependencyProperty et ObservableCollection


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Par défaut DependencyProperty et ObservableCollection
    Bonjour à tous,

    Je viens de découvrir MVVM et j'ai décidé de refaire d'anciens programmes proprement.

    Mon probleme est le suivant : je n'arrive pas à binder une DependencyProperty d'un usercontrol avec une liste de ma vue-model.

    Voici la déclaration de la DependencyProperty dans mon UserControl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static readonly DependencyProperty ListeFichiersProperty = DependencyProperty.Register("ListeFichiers", typeof(ObservableCollection<Fichier>), typeof(ScanFichier));
     
    public ObservableCollection<Fichier> ListeFichiers
     {
                get { if (GetValue(ListeFichiersProperty) == null) return null; return (ObservableCollection<Fichier>)GetValue(ListeFichiersProperty); }
                set { SetValue(ListeFichiersProperty, value); }
    }
    Le binding cote xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:ScanFichier x:Name="USScan" ListeFichiers="{Binding Path=ListeFichier, Mode=TwoWay}"></local:ScanFichier>
    Le binding de la VM sur code (Qui marche je pense)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public AddFilm()
    {
           InitializeComponent();
           this.DataContext = new ViewModel.VMTraitementFilms(this);
    }
    Et pour finir la creation de la VM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public VMTraitementFilms(Window w)
    {
          _window = w;
          ListeFichier = new ObservableCollection<Fichier>();
     
          //var tmp = (AddFilm)w;
          //tmp.USScan.ListeFichiers = ListeFichier;
    }
    Si j'enlève les commentaires de la creation de la VM la dependency a une valeur, mais sinon le binding cote xaml ne fonctionne pas et la valeur reste nulle.

    J'ai essayé avec une ObservableCollection<string> mais le resultat est identique.

    J'ai une commande bindée qui fonctionne donc je supose que le bind V - VM est OK

    Quelqu'un aurait-il une idée svp ?

    Merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Lorsqu'on utilise le modèle MVVM, il faut éviter au maximum de faire des liaisons directes avec la vue dans le ViewModel.
    Donc passer ta fenêtre ou un contrôle au ViewModel est à proscrire si possible :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    public VMTraitementFilms(Window w)

    Voici au passage un tutoriel sur le sujet :
    http://japf.developpez.com/tutoriels...-et-testables/


    Le viewModel sera défini comme ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public VMTraitementFilms()
    {
          ListeFichier = new ObservableCollection<Fichier>();
          // Ajout de film éventuellement ici
          ListeFichier.Add(...); 
    }
    ListeFichier est donc une propriété du ViewModel et c'est sur cette propriété que tu travailleras désormais. Pour ajouter/supprimer des éléments de cette collection, il faudra créer des commandes dans le ViewModel qui agiront sur cette propriété.

    Après pour ton problème de binding, comment fais tu du côté de ton userControl ?

  3. #3
    Membre averti
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Par défaut
    Merci de venir en aide !

    En faite je passe une window en paramettre c'est pour la commande fermer, j'ai besoin de faire window.close(),
    L'idée la plus propre serait de rajouter un évenement dans la classe window et de l'appeler coté VM ?

    Sinon pour le usercontrol il me permet de scanner des fichiers de type video
    Je l'utilise plusieur fois dans mon programme donc c'est pour cela que j'ai un usercontrol, et la seule chose qu'il doit transmettre à la VM est une liste des fichiers selectionnés d'ou la dependencyproperty, la liste est créée dans la VM et le usercontrol la modifie uniquement ensuite pour les traitements la VM utilise cette liste.

    Voila pour le code du usercontrol:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public ScanFichier()
    {
       _lstFichier = new ObservableCollection<Fichier>();
       this.DataContext = this;
       InitializeComponent();
    }
    Je change de Datacontext dans le constructeur donc quand je bind ma liste qui vient de ma VM en faite il la cherche dans le usercontrol et forcement il ne la trouve pas ...

    Au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = this;
    dans le constructeur du usercontrol je vais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GridPrincipal.DataContext = this;

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Citation Envoyé par Tanou
    En faite je passe une window en paramettre c'est pour la commande fermer, j'ai besoin de faire window.close(),
    L'idée la plus propre serait de rajouter un évenement dans la classe window et de l'appeler coté VM ?
    Si ta fenêtre est la fenêtre principale, alors le plus simple est de faire :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Current.MainWindow.Close();
    Sinon, il y une possibilité avec les Attached Behaviours :
    http://adammills.wordpress.com/2009/...ose-from-xaml/


    Pour ton problème de binding, je te conseille vraiment l'article que j'ai mis en lien dans le post précédent. Le projet est téléchargeable dans le § Exemple et il contient exactement ce que tu veux : un userControl contenant une liste "MasterView.xaml" et une fenêtre principale "MainWindow.xaml" dans lequel le DataContext du MasterView est défini. Tu remarqueras que la DependencyProperty n'est pas utile dans le UserControl.

  5. #5
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Bonjour,

    Citation Envoyé par Tanou Voir le message
    Merci de venir en aide !

    En faite je passe une window en paramettre c'est pour la commande fermer, j'ai besoin de faire window.close(),
    L'idée la plus propre serait de rajouter un évenement dans la classe window et de l'appeler coté VM ?
    Un des points essentiels du MVVM est que la vue connaît la vue du modèle mais pas l'inverse. J'ai rencontré ce problème il y a peu et je m'en suis sorti par ce moyen : que mes fenêtres à afficher à partir d'une vue du modèle implémente une interface "IFenetre" permettant d'ouvrir, fermer etc...
    Ainsi on est dans le cas où la Vue et la Vue du Modele voient toutes les deux un type IFenetre, mais la Vue du Modèle ne "connaît" pas la Vue...

Discussions similaires

  1. [MVVM] Binding et DependencyProperty avec une ObservableCollection<T> ou modifier une librairie existante
    Par Cheinz dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 25/04/2012, 12h39
  2. ObservableCollection serialisé en Generic.List avec CollectionDataContract
    Par amandinerenard dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 25/03/2008, 11h02
  3. DependencyProperty : Libération de ressource
    Par dev01 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 29/02/2008, 14h33
  4. [WPF] Problème avec DependencyProperty
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 04/02/2008, 11h10
  5. Data Binding et DependencyProperty
    Par gege02 dans le forum C#
    Réponses: 1
    Dernier message: 22/06/2007, 10h36

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