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 Phone .NET Discussion :

Utilisation de RelativeSource pour gérer la visibilité d'un composant


Sujet :

Windows Phone .NET

  1. #1
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut Utilisation de RelativeSource pour gérer la visibilité d'un composant
    Hello,

    J'utilise une ListBox dans laquelle j'ai un Template qui contient:

    - Une Image
    - Un TextBlock
    - Un bouton

    J'aimerais que les boutons ne soient visibles que sur le SelectedItem de la ListBox.

    Je suis sur la piste suivante mais ça ne donne rien (ou du moins je l'utilise mal):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ListBox ItemsSource={Binding Path=MaCollection} SelectedItem{Binding Path=MaSelection, Mode=TwoWay}>
     <ListBox.ItemTemplate>
      <DataTemplate>
       <StackPanel Orientation="Horizontal">
         <Image Source={Binding Path="..."}><//Image>
         <TextBlock Text={Binding Path="..."}></TextBlock>
         <Button Visibility="{Binding RelativeSource={RelativeSource TemplateParent}, Converter={StaticResource BooleanToVisibilityConverter}, Path=IsSelected, Mode=TwoWay}"></Button>
       </StackPanel>
      </DataTemplate>
     </ListBox.ItemTemplate>
    </ListBox>
    Ben le problème c'est que ça ne fonctionne pas et j'ai le message d'erreur suivant lorsque que j'arrive sur la page:

    Value does not fall within the expected range.
    Donc est-ce possible de récupérer la propriété IsSelected du SelectedItem et de l'injecter dans la propriété Visibility du bouton en passant par un BooleanToVisibilityConverter ?

    Merci
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Points : 963
    Points
    963
    Par défaut
    Je pense que oui !

    Ton converter gère t il une value null ? (je demande car je n'ai pas le code du converter sous les yeux)

    Ca ne pose pas de problème que tu n'ais pas : Mode= dans le relative source ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Binding RelativeSource={RelativeSource Mode=TemplateParent}, Converter={StaticResource BooleanToVisibilityConverter}, Path=IsSelected, Mode=TwoWay}

    Perso je fais plus des trucs comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "{Binding Path=DataContext.IsSelected, RelativeSource={RelativeSource AncestorType=StackPanel}, Mode=TwoWay}"
    Ainsi tu pointe sur le stackpanel de ton ItemTemplate avec un dataContexte qui pointe sur un objet de ta liste

    Mais ça dépend du contexte d'utilisation etc. (j'utilise cette façon de faire car je m'en souviens, ça fonctionne dans 90% des cas du premier coup aussi)

    Edit : j'ai même déjà fait par le passé une classe avec un nom genre ContentControlRelativeSource qui hérite de content control. Je mettais dedans mes grid etc quand je ne voulais pas m'embêter avec les Level d'ancestor type (pratique quand ton ancestortype doit être un stack panel : il y en a tellement que retrouver le bon est parfois la galère) et ainsi on est sur que RelativeSource AncestorType=ctrlLocal:ContentControlRelativeSource pointera sur le bon élément
    "S'adapter, c'est vaincre" - Cellendhyll de Cortavar

  3. #3
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Oui j'ai oublié de mettre le mode dans mon exemple posté.

    Mais ça ne change rien car en fait le Mode te fourni soi Self soit TemplatedParent qui est dans ce cas le ContentPresenter et non le ListBoxItem ....

    Pour les mots Ancestor et FindAncestor ils n'existe plus maintenant ...

    donc coincé
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Points : 963
    Points
    963
    Par défaut
    Et avec templateparent, ne faut-il pas faire un DataContext dans le path ? Genre DataContext.IsSelected

    Ton erreur pourrait venir qu'il recherche la property IsSelected sur les property directe du control ?
    "S'adapter, c'est vaincre" - Cellendhyll de Cortavar

Discussions similaires

  1. [Composite] Utiliser ce pattern pour gérer un planning ?
    Par spike2 dans le forum Design Patterns
    Réponses: 0
    Dernier message: 30/01/2012, 10h37
  2. Réponses: 2
    Dernier message: 29/01/2010, 09h26
  3. [SAX] Utilisation de LexicalHandler pour gérer les données CDATA en base 64
    Par tdeco dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 23/08/2007, 21h58
  4. Utilisation de classes pour gérer une table
    Par mathias dans le forum Access
    Réponses: 11
    Dernier message: 30/08/2006, 16h57
  5. Réponses: 14
    Dernier message: 25/07/2006, 19h12

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