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 :

Binder un élément et pas une propriété


Sujet :

Windows Presentation Foundation

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut Binder un élément et pas une propriété
    Bonjour,

    Je découvre WPF, et je voulais savoir s'il était possible de binder directement un composant, c'est à dire par exemple d'avoir <Grid> dans le XAML et de la binder sur une public Grid Grid dans mon ViewModel. Est-ce que ça existe ? Quelle est la syntaxe ?

    Comme je n'ai pas réussi à trouver, j'ai essayé en bindant la propriété content de l'élément parent (<ScrollViewer Content="{Binding Grid}">) malheureusement au lancement de l'application j'ai l'exception "Specified element is already the logical child of another element. Disconnect it first", ce que je ne comprends pas puisque juste après avoir fait Grid = new Grid() si je fais Grid.Parent j'ai bien null...
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Salut,

    Non ce n'est pas possible de faire ça comme ça.
    C'est dans quel but ?

    Y a plusieurs autres possibilités:
    • Ajouter dans le code behind ta Grid dans le Content de ton ScrollViewer
    • Créer une classe dérivée de Grid (ou un autre control) pour gérer toi même ta Grid (override des méthodes existantes) ou y ajouter des Dependency Properties.



    Par contre je trouve ça un peu choquant d'avoir un contrôle graphique dans un ViewModel. Le ViewModel permet la réutilisation de code dans un autre contexte technique entre autre. Donc si tu veux par exemple porter ton code métier dans un projet WinForms ou Web, si tu inclus un Grid dans ton ViewModel ça risque de poser quelques soucis car elle n'existera pas dans ces technos

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    En fait il ne s'agit pas d'une Grid mais d'un contrôle à moi, qui hérite de DrawingCanvas, une classe que j'ai trouvé qui hérite elle même de Canvas et ajoute les méthodes pour gérer les VisualChild plus facilement.

    Je voulais faire ça simplement parce que je ne sais pas comment mettre à jour facilement mon composant perso. Avant, j'avais simplement mis un x:Name="monComposant" et dans mon viewModel j'avais accès à l'objet vue et donc je pouvais le récupérer et faire ce que je voulais dessus. Maintenant que j'essaye de passer en MVVM, je n'y ai plus accès, et ça me complique pas mal la tâche...
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Il n'empêche que je ne comprend pas ce que tu veux faire concrètement.

    Ce qu'il y a de sûr c'est qu'un ViewModel ne peut pas interagir avec la vue directement alors que l'inverse si. Après tu as toujours la possibilité d'utiliser un pattern avec des ViewMediator qui te permettent d'interagir de ViewModel à ViewModel, de vue en vue et même en faisant un peu d'IOC de faire des actions sur la vue.

  5. #5
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    Globalement, j'ai une liste de donnée et je veux tracer les vecteurs correspondant dans ma vue. Pour ça, j'utilise une classe à moi qui hérite d'une classe DrawingCanvas. Je n'arrive pas à voir comment je pourrais binder les données, donc j'avais fait ça sans binding, à la main quoi. Mais si tu as une solution à me proposer je suis tout ouie.
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Suggestion :

    Tu te créé un userControl à partir de ton canva.
    dans le .cs de ton userControl, tu ajoutes :
    Une DP sur une ObservableCollection de coordonnées.
    Une méthode qui redessine tous tes vecteurs dans le canvas.

    Et dans le Model, tu ajoutes l'ObservableCollection de coordonnées.
    Tu réalises un binding dans le xaml (de la vue) sur ta collection :

    Genre :
    <local:UcVecteurs x:Name="monUcVecteur" ...
    ListCoord="{Binding Model.ListCoord}" ... />

    Et la DP de l'userControl redessine les vecteurs dès que tu mets à jour la liste dans le Model.

  7. #7
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    DP c'est DependencyProperty c'est ça ? Je débarque dans le monde .NET, j'ai jamais utilisé cette objet.
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    DP c'est DependencyProperty c'est ça ? Je débarque dans le monde .NET, j'ai jamais utilisé cette objet.
    Oui, tu codes un truc de ce genre dans le code behind de ton userControl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public ObservableCollection<MyVecteurClass> ObsColVecteurs
    {
    	get
    	{
    		return (ObservableCollection<MyVecteurClass>)GetValue(ObsColVecteursProperty);
    	}
    	set
    	{
    		SetValue(ObsColVecteursProperty, value);
    	}
    }
     
    public static readonly DependencyProperty ObsColVecteursProperty =
       DependencyProperty.Register(
    	  "ObsColVecteurs",
    	  typeof(ObservableCollection<MyVecteurClass>),
    	  typeof(UcVecteurs),
    	  new FrameworkPropertyMetadata(
    		 new PropertyChangedCallback(ChangeObsColVecteurs)));
     
    private static void ChangeObsColVecteurs(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
    	(source as UcVecteurs).UpdateObsColVecteurs((ObservableCollection<MyVecteurClass>)e.NewValue);
    }
     
    public void UpdateObsColVecteurs(ObservableCollection<MyVecteurClass> obsColVecteurs)
    {
    	MethodeQuiRedessineLesVecteurs(obsColVecteurs);
    }

  9. #9
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    Merci, je vais essayer de m'inspirer de ça. Mon problème était surtout que la méthode qui re-dessine les vecteurs doit avoir accès à la vue mais que j'aurais préféré mettre tout ça dans le viewModel, pas dans le code behind..
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    Merci, je vais essayer de m'inspirer de ça. Mon problème était surtout que la méthode qui re-dessine les vecteurs doit avoir accès à la vue mais que j'aurais préféré mettre tout ça dans le viewModel, pas dans le code behind..
    Si j'me trompe pas, le ViewModel ne doit pas bosser sur des éléments de la vue.
    Alors qu'on peut sans soucis (sans violer le MVVM ) bosser dans le code behind d'un userControl contenu dans la vue.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Oui si c'est de l'affichage c'est dans la vue, ca coule de source. Rien ne t'empêche de conserver tes données relatifs à l'emplacement de tes vecteurs dans ton ViewModel et de gérer uniquement l'affichage dans le code behind de ton xaml.

    Pour les Dependency Properties, juste à titre informatif, n'ait pas peur de la syntaxe, tu as un snippet intégré à Visual Studio : propdp
    Et le PropertyChangedCallback, comme son nom l'indique c'est une méthode statique où tu pourras effectuer des actions quelconques juste après le changement de valeur de ta Dependency Property

  12. #12
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    J'ai réussi, merci à tous
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/02/2011, 16h24
  2. Réponses: 1
    Dernier message: 14/04/2010, 20h38
  3. Masquer un élément en fonction de la valeur d'une propriété
    Par Pragmateek dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 05/08/2009, 11h26
  4. [WPF] appliquer un converter a une propriété des éléments d'une collection
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 17
    Dernier message: 23/01/2008, 21h39
  5. Réponses: 3
    Dernier message: 05/10/2007, 13h19

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