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 :

[WPF] - Accéder aux controls sans passer par le binding


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 121
    Points : 96
    Points
    96
    Par défaut [WPF] - Accéder aux controls sans passer par le binding
    Bonjour,

    1 - voila je voudrais savoir comment accéder à mes controls(dans un template) sans passer par le binding

    j'ai un exemple un peu bidon mais bon :
    j'ai défini un template pour une texbox , cette textbox contient tout simplement une image et deux textbox auquels je désirerais pouvoir accéder directement sans passer par le binding (pitié ne me dites pas que cela n'est pas possible :p)

    dans l'idée en fait je définirais par exemple dynamiquement des données (une liste de contacts pourquoi pas) et donc je modifierais la source de l'image, et les propriétés text des textbox txtName et txtFirstName (dans le code behind)

    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
    
        <TextBox Name="txtTemplate">
          <TextBox.Template>
            <ControlTemplate >
              <Grid ShowGridLines="True">
                <Grid.ColumnDefinitions>              
                  <ColumnDefinition Width="200"/>
                  <ColumnDefinition Width="80"/>
                  <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                  <RowDefinition/>
                  <RowDefinition/>
                </Grid.RowDefinitions>
                <Image Name="Photo" Width="150" Height="150" Grid.Column="0" Grid.Row="0"/>
                <Label Width="80" Height="25" Grid.Column="1" Grid.Row="0" Content="Name :"/>
                <TextBox Name="txtName" Width="150" Height="20" Grid.Column="2" Grid.Row="0" />
                <Label Width="80" Height="25" Grid.Column="1" Grid.Row="1" Content="FirstName :"/>
                <TextBox  Name="txtFirstName" Width="150" Height="20" Grid.Column="2" Grid.Row="1"  />
              </Grid>
            </ControlTemplate>
          </TextBox.Template>
        </TextBox>

    2 - de plus si je veux pousser mon raisonnement plus loin et imaginer que par exemple chaque ListBoxItem d'une Listbox aurait ce template, comment accéder à l'image et aux 2 textbox de chaque ListBoxItem lors de l'ajout (Add) entre autres (sans passer par le binding) ?


    ++

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    1) Utilise la méthode FindName

    2) Toujours FindName ou alors, tu peux utiliser les méthodes de la classe VisualTreeHelper pour parcourir ton graph d'objet jusqu'a tomber sur ce que tu cherches

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 121
    Points : 96
    Points
    96
    Par défaut
    Merci beaucoup pour ses "tuyaux"
    je vais regarder cela des que j'ai un moment et je repasserai pour cliquer sur résolu alors

    merci beaucoup
    ++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 121
    Points : 96
    Points
    96
    Par défaut
    Fwaa j'ai trouvé
    mais c'est pas ce qu'il y a de plus simple

    avec FindName() je n'arrive à accéder qu'aux controls qui sont déclarés côté window.g.cs en fait, mais pas aux controls du template (txtName,txtFirstName,et Photo)

    Avec Visual j'arrive à accéder à mes controls du template mais on ne peut pas dire qu'au niveau code ce soit ce qu'il y a de plus simple

    exemple :
    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
     
     
    // Appel 
    EnumVisual(txtTemplate);
     
     
    //
    public void EnumVisual(Visual oVisual)
            {
                for (int nVisualChildrenCount = 0; nVisualChildrenCount < VisualTreeHelper.GetChildrenCount(oVisual); nVisualChildrenCount++)
                {
                    Visual childVisual;
     
                    childVisual = (Visual)VisualTreeHelper.GetChild(oVisual, nVisualChildrenCount);
     
                    if (childVisual is TextBox)
                    {
                        TextBox wantedChild = childVisual as TextBox;
                        //
                        if (wantedChild.Name == "txtName")
                        {
                            wantedChild.Text = "trouvé";
                        }
                    }
     
                    //
                    EnumVisual(childVisual);
                }
            }

    c'est quand même important je trouve
    WPF est sensé rendre plus indépendante l'IU - du code
    , mais en fait on se retrouve plus que jamais lié à l'IU car on est quasiment obligé de passer par le binding
    comme je ne suis pas trop adepte du binding (car soit tout marche soit plus rien ne marche) et on n'a plus assez de controle car justement tout se fait trop de manière transparente

    l'interet pour le programmeur c'est de pouvoir accéder facilement à ses controls
    pour moi justement l'IU ne sert qu'à afficher les informations, il ne faut pas que je sois prisonnier du binding

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu est sur qu'avec ce code, cela ne fonctionne pas ?

    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
     
    <TextBox Name="txtTemplate">
          <TextBox.Template>
            <ControlTemplate >
              <Grid ShowGridLines="True" x:Name="grid">
                <Grid.ColumnDefinitions>              
                  <ColumnDefinition Width="200"/>
                  <ColumnDefinition Width="80"/>
                  <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                  <RowDefinition/>
                  <RowDefinition/>
                </Grid.RowDefinitions>
                <Image Name="Photo" Width="150" Height="150" Grid.Column="0" Grid.Row="0"/>
                <Label Width="80" Height="25" Grid.Column="1" Grid.Row="0" Content="Name :"/>
                <TextBox Name="txtName" Width="150" Height="20" Grid.Column="2" Grid.Row="0" />
                <Label Width="80" Height="25" Grid.Column="1" Grid.Row="1" Content="FirstName :"/>
                <TextBox  Name="txtFirstName" Width="150" Height="20" Grid.Column="2" Grid.Row="1"  />
              </Grid>
            </ControlTemplate>
          </TextBox.Template>
        </TextBox>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Grid grid = this.txtTemplate.Template.FindName("grid", this.txtTemplate) as Grid;
     
    if(grid != null)
    {
         Image img = (Image)grid.FindName("Photo");
         TextBox txtName = (TextBox)grid.FindName("txtName");
         TextBox txtFirstName = (TextBox)grid.FindName("txtFirstName");
    }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 121
    Points : 96
    Points
    96
    Par défaut
    erf
    j'ai vu ton blog sur CodeS-SourceS
    donc c'est nickel :p
    (j'ai un autre pseudo sur le site CodeS-SourceS >> romagny13)

    au passage juste un compliment mais vraiment je suis fan de tous tes articles et webcasts
    bonne continuation
    ++

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par DonJR
    erf
    j'ai vu ton blog sur CodeS-SourceS
    donc c'est nickel :p
    (j'ai un autre pseudo sur le site CodeS-SourceS >> romagny13)
    Ah, c'est donc toi romagny13

    au passage juste un compliment mais vraiment je suis fan de tous tes articles et webcasts

    Merci

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

Discussions similaires

  1. [eZ Publish] Comment accéder à une URL prédéfinie sans passer par le moteur d'EZ ?
    Par eroux dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 08/08/2012, 10h55
  2. Réponses: 10
    Dernier message: 26/07/2006, 07h52
  3. Accéder à une page web sans passer par login et mdp
    Par benthebest dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/07/2006, 01h04
  4. Accéder BD sans passer par localhost
    Par simsky dans le forum Installation
    Réponses: 4
    Dernier message: 01/05/2006, 12h36
  5. Réponses: 2
    Dernier message: 06/01/2005, 21h09

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