locked
extraire element d'une listbox RRS feed

  • Question

  • salut, j'essaye de récupérer la valeur d'un textblock d'une listbox , j'ai essayé avec ce code :

    var count = VisualTreeHelper.GetChildrenCount(listbox2);
                    if (count == 0)
                        return;
    
                    for (int i = 0; i < count; i++)
                    {
                        var child = VisualTreeHelper.GetChild(listbox2, i);
                        if (child is TextBlock)
                        {
                            TextBlock targetItem = (TextBlock)child;
    
                            if (targetItem.Name == "name")
                            {
                                ....
                            }
                        }
                    }

    mais il ne retourne qu'un seul element malgré que la listbox contient plusieurs elements :

    <ListBox Grid.Row="1" Height="553" HorizontalAlignment="Left" Margin="0,170,0,0" x:Name="listbox2" VerticalAlignment="Top" Width="480" >
                
                <ListBox.ItemTemplate>
                    
                    <DataTemplate>
                        
                        <StackPanel Orientation="Vertical" Height="Auto" Width="470" >
                            
                                <StackPanel.Background>
                                    <ImageBrush ImageSource="/BH_Mobile_Banque;component/Images/pann_compte.png" Stretch="Fill" />
                                </StackPanel.Background>
                            <TextBlock   FontSize="28"  x:Name="solde" TextWrapping="Wrap" >
                                      <Run Text="        Solde : " Foreground="Black"/>
                                    <Run Text="{Binding amount}"  />
                            </TextBlock>
                          
                            <TextBlock FontSize="28"  x:Name="texblock1" TextWrapping="Wrap" >
                                      <Run Text="        Date: " Foreground="Black"/>
                                    <Run Text="{Binding operationDate}"/>
                                </TextBlock>
                            
                            <TextBlock   FontSize="28"  x:Name="texblock2" TextWrapping="Wrap"  TextTrimming="WordEllipsis">
                                      <Run Text="        Operation: " Foreground="Black"/>
                                    <Run Text="{Binding operation}"  />
                                </TextBlock>
                                <TextBlock  FontSize="28"  x:Name="texblock3" TextWrapping="Wrap" >
                                      <Run Text="        Type : " Foreground="Black"/>
                                    <Run Text="{Binding id}"/>
                                </TextBlock>
    
                            
                        </StackPanel>
                    </DataTemplate>
                
                </ListBox.ItemTemplate>
           </ListBox>
            



    zipo

    dimanche 13 mai 2012 22:28

Réponses

  • Salut, j'ai trouvé la solution  à l'aide d'un Converter :

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                
    if (value == null)
                {
                    return new SolidColorBrush(Colors.Red);
                }

                if (value.ToString().StartsWith("-"))
                {
                    return new SolidColorBrush(Colors.Red);
                }

                return new SolidColorBrush(Colors.Green);
                }
                
            }

    et en xaml:

    <TextBlock   FontSize="28"  x:Name="solde" TextWrapping="Wrap"  >
                                      <Run Text="        Solde : " Foreground="Black"/>
                                    <Run Text="{Binding amount}" Foreground="{Binding amount, Converter={StaticResource PositionConverter}}" Language="fr-FR"/>
                               
                            </TextBlock>

    mais le problème qu'il sarrête dans la première condition cad: val est toujours  null !malgré que value a bien la valeur cherché !  quelqu'un a une idée? 



    zipo



    • Modifié Zied Nassr vendredi 18 mai 2012 14:34 résolut
    • Marqué comme réponse Zied Nassr vendredi 18 mai 2012 14:34
    mercredi 16 mai 2012 10:48

Toutes les réponses

  • Bonjour,

    Tu utilise le binding pour charger ta ListBox, tu dois pouvoir caster le DataContext de ta page dans le type de l'objet ? Dans ce cas tu aura accès aux valeurs des TextBlock.


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    lundi 14 mai 2012 07:50
  • Salut Zipo!

    Pourquoi ne bind tu pas l'ItemsSource de ta listbox? Grace à cela, tu pourrais bindé aussi l'ItemSelected et donc récupérer quand tu veux l'item choisit.
    Aussi, tu peux utiliser les Command afin de faire des actions lorsque ta séléction change.

    C'est quoi ton but exactement?

    lundi 14 mai 2012 07:51
  • Salut, suis d'accord avec Jérôme et Zipo..

    Si tu veux vraiment boucler sur ta liste essai un truc dans le genre :

    TonObjet rr;
    
                for (int i = 0; i < _listbox2.Items.Count; i++)
                {
                    rr = (TonObjet )_listbox2.SelectedItems[i];
                    System.Diagnostics.Debug.WriteLine("{0}", rr.amount);
                }

    lundi 14 mai 2012 08:13
  • Jérôme peux tu expliquer un peut plus avec un exemple? 

    Merci


    zipo

    lundi 14 mai 2012 08:52
  • @toss je ne cherche pas à accéder a un element selectioné mais lors du chargement de la liste, mais j'ai déja essayé ta méthode et il n'accéde qu'au premier element ensuite il lance une exception d'une valeur non aboutit

    zipo

    lundi 14 mai 2012 08:54
  • Pour charger ta ListBox, tu fais bien comme ceci par exemple (dans le constructeur de la page) ?

    this.DataContext = new Foo();

    Si oui, tu peux accéder à tes données (donc des éléments actuellement bindé à la ListBox) via un simple cast :

    Foo foo = this.DataContext as Foo;
    if(foo != null)
    {
      // ...
    }


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    lundi 14 mai 2012 09:06
  • j'ai essayé avec cela :

     this.DataContext = new TextBlock();
                TextBlock text = this.DataContext as TextBlock;
                if (text != null)
                {
                    if (text.Text.StartsWith("-"))
                    {
                        text.Foreground = new SolidColorBrush(Colors.Red);
    
                    }
                    else
                    {
                        text.Foreground = new SolidColorBrush(Colors.Green);
                    }
                }
    mais text reste toujours null :/


    zipo

    lundi 14 mai 2012 09:56
  • Heu... Non c'est pas du tout ça, tu essaye de binder un TextBlock à ta page :)

    Dans mon exemple, Foo() représente ta "source de donnée", celle qui va remplir ta grille. Comment est-elle actuellement remplie ?


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    lundi 14 mai 2012 12:10
  • a ok j'ai compris ce que tu veux faire 
    listbox2.ItemsSource = from response in xmlItems.Descendants("result")
    
                                           let nam = response.Element("operationDate")
                                           let rb = response.Element("operation")
                                           let tp = response.Element("id")
                                           let amt = response.Element("amount")
                                           select new auth
                                           {
                                               operationDate = nam == null ? null : nam.Value,
                                               operation = rb == null ? null : rb.Value,
                                               id = tp == null ? null : tp.Value,
    
                                               amount = amt == null ? null : amt.Value,
    
    
                                           };
    mais comment je peux accéder aux proporiétés de Textblock comme le Foreground ?

    zipo

    lundi 14 mai 2012 13:56
  • Ok.

    Sache que les autres propriétés sont bindables, c'est donc le cas pour Foreground

                            <TextBlock FontSize="28" x:Name="texblock1" TextWrapping="Wrap" >
                                    <Run Text="        Date: " Foreground="{Binding Foreground}"/>
                                    <Run Text="{Binding operationDate}"/>
                            </TextBlock>
    


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    lundi 14 mai 2012 14:15
  • OK,mais comment je peux accéder à la valeur de textBlock qui est déja dans la listbox pour tester selon lui le changement de foreground !?

    zipo


    lundi 14 mai 2012 16:30
  • L'idée c'est de faire l'inverse justement, d'où le binding sur la propriété Foreground.

    A chaque item correspondant dans ta source de donnée, définit directement la valeur de Foreground, comme ça tu n'aura pas à rebaléyer ta ListBox :)


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    lundi 14 mai 2012 19:16
  • c'est tres simple puisque tu travail avec une liste remplis par un objet determiner,

    pour prendre la valeur de l'élément selectione il vous suffit d'exploiter la SelectedItem comme suit;

    votreObject element = (votreObject)listbox2.SelectedItem;

    si tu veut prendre tous les éléments et tu cherche a les stockes d'une façon traditionnel dans un vecteur

    tu mettra une simple boucle

    List<votreObject> maListe = new List<Operation_Object> ();

    for(int i =0;i<listbox2.Items.Count; i++){

                 listBox1.SelectedIndex = i;

     maListe.Add((votreObject)listbox2.SelectedItem);
               

    }

    mardi 15 mai 2012 09:45
  • Salut, j'ai trouvé la solution  à l'aide d'un Converter :

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                
    if (value == null)
                {
                    return new SolidColorBrush(Colors.Red);
                }

                if (value.ToString().StartsWith("-"))
                {
                    return new SolidColorBrush(Colors.Red);
                }

                return new SolidColorBrush(Colors.Green);
                }
                
            }

    et en xaml:

    <TextBlock   FontSize="28"  x:Name="solde" TextWrapping="Wrap"  >
                                      <Run Text="        Solde : " Foreground="Black"/>
                                    <Run Text="{Binding amount}" Foreground="{Binding amount, Converter={StaticResource PositionConverter}}" Language="fr-FR"/>
                               
                            </TextBlock>

    mais le problème qu'il sarrête dans la première condition cad: val est toujours  null !malgré que value a bien la valeur cherché !  quelqu'un a une idée? 



    zipo



    • Modifié Zied Nassr vendredi 18 mai 2012 14:34 résolut
    • Marqué comme réponse Zied Nassr vendredi 18 mai 2012 14:34
    mercredi 16 mai 2012 10:48
  • voila un fichier, que je souhait vous aide pour résoudre ton problème

    http://www.dotnet-france.com/Documents/WPF/Le%20databinding.pdf



    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".


    jeudi 17 mai 2012 07:55