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 :

ItemsControls, accès à un control enfant


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut ItemsControls, accès à un control enfant
    Bonjour,

    j'ai dans mon XAML un ItemsControl avec des enfants :

    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
       <ItemsControl x:Name="itemsControlPenalty" ItemsSource="{Binding SelectedAthleteResult.ObstaclePenalties}">
                        <ItemsControl.Template>
                            <ControlTemplate>
                                <ScrollViewer VerticalScrollBarVisibility="Auto">
                                    <ItemsPresenter/>
                                </ScrollViewer>
                            </ControlTemplate>
                        </ItemsControl.Template>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                                                   <Label Grid.Column="0" Content="{Binding ObstacleEvent.ObstacleId.Value}" />
                                    <TextBox Grid.Column="1" x:Name="textBoxPenalty" Text="{Binding Penalty.Value, Converter={StaticResource PenaltyConv}}" TextChanged="TextBox_TextChanged" />                                <Label Grid.Column="2" FontWeight="Bold" Content="="/>
                                    <Label Grid.Column="3" FontWeight="Bold" Content="{Binding TotalObstaclePenaltiesPoints}"/>
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
    Je souhaite pouvoir updater une property TOTAL points chaque fois que la valeur de la textbox.text(dans le datatemplate) est modifiée, C'est pour cela que j'utilise la méthode TextBox_TextChanged.

    J'ai donc un nombre x de textbox créée avec le DataTemlate

    Dans mon code behind, j'ai besoin de reprendre chaque textBox de chaque instance de mon datatemplate afin de vérifier le contenu.

    Malheureusement, je n'arrive à reprendre que l'item textbox 0, donc uniquement mon item datatemplate 0.

    Voici le code behind:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
     {
        for (int counter = 0; counter < itemsControlPenalty.Items.Count; counter++)
                {
                    TextBox textboxPenalty = FindChildByType<TextBox>(itemsControlPenalty);
    La méthode permettant d'atteindre le control TextBox (qui ne fonctionne pas!)

    private T FindChildByType<T>(DependencyObject parent)where T : DependencyObject {
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)

    {

    DependencyObject child = VisualTreeHelper.GetChild(parent, i);

    if (child is T)

    return child as T;

    DependencyObject grandchild = FindChildByType<T>(child);

    if (grandchild != null)

    return grandchild as T;

    }

    return default(T);

    Source de la méthode :
    http://social.msdn.microsoft.com/For...0-d1af65f03485

    si j'ai par exemple 3 éléments textbox avec des valeurs de 40, 30, 20
    L'élément retourné sera toujours la textbox item contenant 40 (donc la textbox item 0).

    J'ai essayé de modifier la méthode en passant un index pour retourner le bon élément ou de directement pointer sur le bon DataTemplate, mais rien n'y a fait...

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

    merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Si tu veux garder le même mécanisme, on peut modifier la méthode FindChild pour qu'elle renvoie toutes les textbox trouvées :

    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
    private IEnumerable<T> FindAllChildrenByType<T>(DependencyObject parent)where T : DependencyObject {
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
     
    {
     
    DependencyObject child = VisualTreeHelper.GetChild(parent, i);
     
    if (child is T)
     
    yield return child as T;
     
    DependencyObject grandchild = FindChildByType<T>(child);
     
    if (grandchild != null)
     
    yield return grandchild as T;
     
    }
     
    }
    A partir de là tu n'as plus qu'à faire ton addition dans ton event :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
     {
        foreach (var textBoxPenalty in FindAllChildrenByType<TextBox>(itemsControlPenalty))
                {
                     // Ton code

    Mais je pense que ton approche est mauvaise. Pourquoi énumérer les textbox, alors que tu as bindé dessus la valeur des objets de la collection SelectedAthleteResult.ObstaclePenalties ? Énumère directement ta collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int sum = 0;
     
    foreach (var obstaclePenalty in SelectedAthleteResult.ObstaclePenalties)
    {
       sum += obstaclePenalty.Penalty.Value;
    }

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut
    merci pour ta réponse.

    Non, je ne veux pas additionner la valeur de mes textboxes, j'ai une propriété pour Total cela.

    Ce que je veux, c'est que lorsque l'utilisateur tape du texte dans une textbox, lorsqu'il tape ";", la propriété Total s'update (en fait un UpdateSourceTrigger mais appelé en code behind, car j'ai besoin que ma propriété s'update lors de l'event LostFocus et lorsque l'on tape ";"

    Est-ce plus clair comme cela?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    C'est plus clair comme ça effectivement. Est-ce que la méthode FindAllChildrenByType que j'ai donné résout ton problème ?

    Sinon tu peux aussi essayer d'utiliser l'évènement KeyDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.OemPeriod)
        {
            var textBox = (TextBox)sender;
     
            // Ton traitement
        }
    }

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut
    non, la méthode FindAllChildrenByType me retournes toujours l'item TextBox 0 et pas les suivantes, même si je suis en train de modifier l'item Textbox 5 par exemple.

    Pour ce qui est de la méthode Key_DOWN, le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (e.Key == System.Windows.Input.Key.OemPeriod)
    ne peut pas être utilisé pour moi, car j'ai comme séparateur ; ou :

    dans les 2 cas, il faut bien presser 2 touches Clavier et non une seule...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Bah sinon sur le même principe, garder le TextBoxChanged et récupérer la textbox à l'aide du paramètre sender :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
     {
        var textBox = (TextBox)sender;
        // Ton code
    }

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut
    euhhh... effectivement c'est tellement plus simple!!!!

    Merci !

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

Discussions similaires

  1. [WPF] datatemplate acces aux controls
    Par MrCyprom dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 21/09/2007, 16h17
  2. Acces aux controles d'un form depuis en module
    Par tomkich dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/02/2007, 17h18
  3. Réponses: 3
    Dernier message: 26/04/2006, 20h16
  4. [C#] acces à un control depuis code behind
    Par Louis-Guillaume Morand dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/04/2006, 08h42
  5. [VB.net] Acces aux controles d'une form a partir d'une autre
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/01/2006, 12h47

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