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 :

ElementName=This ? Possible ?


Sujet :

Silverlight

  1. #1
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut ElementName=This ? Possible ?
    Bonjour,

    Petite question concernant le Binding sur ElementName.

    En fait, j'ai un UserControl qui a son DataContext bindé sur ma VM. J'aimerais binder des propriétés (Background) de composant se trouvant dans ma vue sur des propriétés de la vue.

    Donc, par exemple, j'ai une Border dans ma vue, j'aimerais la binder sur une propriété BrushBorder qui se trouve dans ma vue et non dans ma VM.

    Pour se faire, rien de plus simple, je mets un x:Name à mon UserControl et j'utilise ElementName dans mon Binding en spécifiant ce nom.

    Tout fonctionne bien jusqu'a quand je veux ajouter plusieurs de ces composants dans le même StackPanel et là, erreur, le StackPanel ne peut pas contenir plusieurs composants de même nom (truc du genre).

    Donc, je me demandais s'il n'était pas possible de faire quelque chose du style (ElementName=This) en Silverlight ? J'ai testé, ça n'a pas fonctionné et n'ai pas trouvé beaucoup de doc là dessus sur le net.

    RelativeSource=Self ne donnait rien non plus.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Effectivement ca ne peut pas marcher: ElementName cherche dans les ressources un élément qui a la chaine spécifiée en x:Key

    Edit: si tu trouves une solution je suis preneur vu que j'ia le même problème

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Effectivement ca ne peut pas marcher: ElementName cherche dans les ressources un élément qui a la chaine spécifiée en x:Key
    Ca c'est avec Source={StaticResource ...}

    Et en mettant le LayoutRoot de l'UC en ElementName au lieu de l'UC en lui même ?

  4. #4
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Pourrais-tu montrer le code (pas besoin du projet, juste le XAML). Je ne suis pas sur d'avoir très bien compris ce que tu veux

  5. #5
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    Ca c'est avec Source={StaticResource ...}

    Et en mettant le LayoutRoot de l'UC en ElementName au lieu de l'UC en lui même ?
    Bah en fait, je voulais accéder directement à l'UC pour binder vers les propriétés du code behind (de cet UC), je ne pense pas qu'en bindant sur la Grid j'y arriverais, j'arriverai seulement à binder sur les propriétés de cette grid non ?

  6. #6
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Samoteph Voir le message
    Pourrais-tu montrer le code (pas besoin du projet, juste le XAML). Je ne suis pas sur d'avoir très bien compris ce que tu veux
    Je peux poster du code demain, je n'ai pas le projet sous la main.
    Mais en fait, je voulais juste binder le Background d'une Border sur une propriété se trouvant dans le code behind du UserControl la contenant.

    En gros, voici un ptit exemple rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <UserControl ...>
       <Grid>
           <Border Background={Binding MonBackground, ???}/>
       </Grid>
    </UserControl>
    Dans mon code behind du UserControl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public MonUC()
    {
       this.DataContext = new VM_MonUC();
    }
     
    private SolidColorBrush _monBackground;
    public SolidColorBrush MonBackground
    {
       get { return _monBackground; }
       set { _monBackground = value; RaisePropertyChange("MonBackground"); }
    }
    Voilà en gros ... Une solution serait biensûr de placer MonBackground dans VM_MonUC mais j'aimerais garder tout ce qui est Design/Graphique dans ma vue et non dans ma VM.

    Voilà, j'espère avoir été plus clair.
    Si tu as des questions supplémentaires, n'hésite pas.

    Merci pour ton (votre) aide.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Mets la en resource.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <UserControl>
       <UserControl.Resources>
          <SolidColorBrush x:Key="monBackground" />
       </UserControl.Resources>
       <Grid>
           <Border Background="{StaticResource monBackground}"/>
       </Grid>
    </UserControl>

    Pis en code behind

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Color Bg
    {
        get { return (this.Resources["bg"] as SolidColorBrush).Color; }
        set { (this.Resources["bg"] as SolidColorBrush).Color = value; }
    }

    Pour changer la couleur

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    monUC.Bg = Colors.Blue;

  8. #8
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Ok, parfait, je vais utiliser cette solution. :-)

    Merci beaucoup !

  9. #9
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    personnellement j'utilise une autre solution :

    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
     
     
    public MonUC()
    {
       this.LayoutRoot.DataContext = this;
       this.MonVM = new MonVM();
    }
     
    private MonVM _monVM;
    public MonVM MonVM()
    {
       get { return _monVM; }
       set { _monVM = value; RaisePropertyChange("MonVM"); }
    }
     
    private SolidColorBrush _monBackground;
    public SolidColorBrush MonBackground
    {
       get { return _monBackground; }
       set { _monBackground = value; RaisePropertyChange("MonBackground"); }
    }
    coté XAML ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <UserControl ...>
       <Grid>
           <Border Background="{Binding MonBackground}"/>
           <TextBlock Text="{Binding MonVm.MonText}"/>
       </Grid>
    </UserControl>
    J'avais expliqué le principe dans un billet de mon Blog, il y a quelque temps.

  10. #10
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Ah ouais, c'est pas mal non plus comme solution ... ;-)

    Vais voir laquelle j'utilise ^^

    Pas mal 2 solutions pour résoudre un problème.

    Merci

  11. #11
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Sauf erreur de ma part, je me permets de corriger une petite erreur dans le code de Skyounet (Dans le souci de ne pas laisser une erreur dans le post) :

    Citation Envoyé par Skyounet Voir le message
    Mets la en resource.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <UserControl>
       <UserControl.Resources>
          <SolidColorBrush x:Key="monBackground" />
       </UserControl.Resources>
       <Grid>
           <Border Background="{StaticResource monBackground}"/>
       </Grid>
    </UserControl>

    Pis en code behind

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Color Bg
    {
        get { return (this.Resources["bg"] as SolidColorBrush).Color; }
        set { (this.Resources["bg"] as SolidColorBrush).Color = value; }
    }

    Pour changer la couleur

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    monUC.Bg = Colors.Blue;
    bg se nomme monBackground dans les ressources.

    Donc

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Color Bg
    {
        get { return (this.Resources["monBackground "] as SolidColorBrush).Color; }
        set { (this.Resources["monBackground "] as SolidColorBrush).Color = value; }
    }

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

Discussions similaires

  1. [DOM] delete this possible?
    Par Rashomonfr dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 31/10/2006, 17h46
  2. Application 'classique' possible en java ?
    Par jeanphy dans le forum JBuilder
    Réponses: 3
    Dernier message: 26/03/2003, 22h24
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22
  5. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38

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