none
XAML : valeur d’une Textbox intégrée à une Listview et définie dans un Datatemplate RRS feed

  • Question

  • Bonjour, je développe une application UWP pour Windows 10 mobile.

    J’ai intégré une TextBox dans une Listview, mais je ne parviens pas à récupérer la valeur de cette TextBox (probablement dû au fait que la TextBox se trouve dans un DataTemplate).

    Merci de m’aider, c’est ma première app UWA (je développais avant en Silverlight), cela fait plusieurs jours que je cherche une solution sur tous les forums, mais je n’ai rien trouvé qui fonctionne.

     

    Voici un extrait de mon code XAML :

    <PivotItem Header="Favoris" Margin="0,0,0,0">
        <SemanticZoom Name="szFavoris" Height="500">
            <SemanticZoom.ZoomedInView>
                <ListView x:Name="listBoxobjFav" 
                            ItemsSource="{Binding Source={StaticResource cvsFavoris}}" 
                            BorderBrush="#FF141EE4"  Width="360" Height="495" Margin="0,10,0,0" VerticalAlignment="Top" 
                            IsItemClickEnabled="True" SelectionMode="Multiple" SelectionChanged="listBoxobjFav_SelectionChanged">
    
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="210" />
                                    <ColumnDefinition Width="80" />
                                </Grid.ColumnDefinitions>
    
                                <TextBlock x:Name="NameTxt" Grid.Column="0" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding Name}" FontSize="20" Foreground="White"/>
                                <TextBox Grid.Column="1" 
                                                x:Name="QteArt" 
                                                Text="{Binding QteArt, Mode=TwoWay}" 
                                                HorizontalAlignment="Right" 
                                                FontSize="16" 
                                                Foreground="DarkGray" 
                                                InputScope="Number" 
                                                Visibility="Visible"
                                                PlaceholderText="{Binding UniteMesure}"
                                                />      
                                <!-- c'est cette valeur QteArt que je voudrais récupérer dans mon code behind -->
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
    
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.HeaderTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Key}" Foreground="CadetBlue" FontSize="18" />
                                </DataTemplate>
                            </GroupStyle.HeaderTemplate>
                        </GroupStyle>
                    </ListView.GroupStyle>
    
                    <ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="FocusVisualPrimaryBrush" Value="Transparent"/>
                        </Style>
                    </ListView.ItemContainerStyle>
    
                </ListView>
            </SemanticZoom.ZoomedInView>
    
            <SemanticZoom.ZoomedOutView>
                <ListView x:Name="listBoxCatFav" SelectionMode="None" Width="360" Height="500" IsItemClickEnabled="True" BorderBrush="#FF141EE4" >
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Margin="15,20,0,0" x:Name="CatTxt" Text="{Binding Group.Key}" TextWrapping="Wrap" Foreground="CadetBlue" FontSize="18"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </SemanticZoom.ZoomedOutView>
        </SemanticZoom>
    </PivotItem>

    vendredi 6 avril 2018 17:18

Réponses

  • Bonjour,

    Pardon pour la réponse tardive, mais j’étais sur un autre problème en attendant une réponse.

    Tout fonctionne maintenant correctement, la faute à mon…étourderie !

    Le problème se trouvait dans le code behind.

    En quelques mots : les items sélectionnés proviennent de 2 tables différentes: Favori et Articles, avant de les recopier dans une 3<sup>ème</sup> table Panier. Si l’item provient de la table Articles, je ne reprends pas la quantité,  contrairement à celui qui provient de la table Favori.

    Pour info voici le code behind corrigé. Encore merci.

    private void btnAccept_Click(object sender, RoutedEventArgs e) // ajouter les favoris sélectionnés dans la table Panier
            {
                // on construit une liste composée des éléments sélectionnés
                List<Favori> selectedItemsFav = new List<Favori>();
                foreach (Favori itemFav in listBoxobjFav.SelectedItems)
                {
                    itemFav.IsChk = "";
                    selectedItemsFav.Add(itemFav);
                    // maj table Favori
                    Db_Helper.UpdateFavori(itemFav);
                }
                //
                
                // puis on recopie chaque favori dans la table Panier
                foreach (Favori item in selectedItemsFav)
                {
                    Db_Helper.Insert(new Panier(currentListeAchat, item.Name, item.NomCat, item.UniteMesure, item.Note, item.QteArt, "Out"));
                }
                //
                // la même chose pour les articles
                //
                // on construit une liste composée des éléments sélectionnés
                List<Articles> selectedItemsArt = new List<Articles>();
                foreach (Articles itemArt in listBoxobjArt.SelectedItems)
                {
                    itemArt.IsChk = "";
                    selectedItemsArt.Add(itemArt);
                }
                // puis on recopie chaque favori et chaque article dans la table Panier
                foreach (Articles item in selectedItemsArt)
                {
                    Db_Helper.Insert(new Panier(currentListeAchat, item.Name, item.NomCat, item.UniteMesure, item.Note, "", "Out"));
                }
    
    
                // on ferme la page et on va sur la page Paniers 
                Frame.Navigate(typeof(Paniers), currentListeAchat);
            }

    • Marqué comme réponse Mani035 samedi 14 avril 2018 11:55
    samedi 14 avril 2018 11:53

Toutes les réponses

  • Bonjour Mani035,

    assurez vous que la propriété du contexte de la ListView QteArt soit notifiable aux changements de valeur. Vous pouvez accéder aux éléments seléctionnés de votre ListView depuis votre code behind :

    public MainPage()
            {
                this.InitializeComponent();
    
                DataContext = new List<string> { "item1", "item2", "item3", "item4", "item5", "item6" };
            }
    
    private void Button_Click(object sender, RoutedEventArgs e)
            {
                List<string> mySelectedItems = new List<string>();
    
                foreach (var item in myListView.SelectedItems)
                {
                    mySelectedItems.Add(item as string);
                }
    
                var text = String.Join(", ", mySelectedItems.ToArray());
            }

    Dans cet exemple, j'ai simplement bindé ma ListView à une collection de string, mais cela s'applique aussi avec des objets plus complexes. 

    Cordialement,

    lundi 9 avril 2018 09:31
  • Bonjour Arthur,

    Merci pour votre réponse et votre exemple. Je vais essayer de l'appliquer et vous informe du résultat.

    Cordialement,

    mardi 10 avril 2018 11:56
  • Bonjour,

    Pardon pour la réponse tardive, mais j’étais sur un autre problème en attendant une réponse.

    Tout fonctionne maintenant correctement, la faute à mon…étourderie !

    Le problème se trouvait dans le code behind.

    En quelques mots : les items sélectionnés proviennent de 2 tables différentes: Favori et Articles, avant de les recopier dans une 3<sup>ème</sup> table Panier. Si l’item provient de la table Articles, je ne reprends pas la quantité,  contrairement à celui qui provient de la table Favori.

    Pour info voici le code behind corrigé. Encore merci.

    private void btnAccept_Click(object sender, RoutedEventArgs e) // ajouter les favoris sélectionnés dans la table Panier
            {
                // on construit une liste composée des éléments sélectionnés
                List<Favori> selectedItemsFav = new List<Favori>();
                foreach (Favori itemFav in listBoxobjFav.SelectedItems)
                {
                    itemFav.IsChk = "";
                    selectedItemsFav.Add(itemFav);
                    // maj table Favori
                    Db_Helper.UpdateFavori(itemFav);
                }
                //
                
                // puis on recopie chaque favori dans la table Panier
                foreach (Favori item in selectedItemsFav)
                {
                    Db_Helper.Insert(new Panier(currentListeAchat, item.Name, item.NomCat, item.UniteMesure, item.Note, item.QteArt, "Out"));
                }
                //
                // la même chose pour les articles
                //
                // on construit une liste composée des éléments sélectionnés
                List<Articles> selectedItemsArt = new List<Articles>();
                foreach (Articles itemArt in listBoxobjArt.SelectedItems)
                {
                    itemArt.IsChk = "";
                    selectedItemsArt.Add(itemArt);
                }
                // puis on recopie chaque favori et chaque article dans la table Panier
                foreach (Articles item in selectedItemsArt)
                {
                    Db_Helper.Insert(new Panier(currentListeAchat, item.Name, item.NomCat, item.UniteMesure, item.Note, "", "Out"));
                }
    
    
                // on ferme la page et on va sur la page Paniers 
                Frame.Navigate(typeof(Paniers), currentListeAchat);
            }

    • Marqué comme réponse Mani035 samedi 14 avril 2018 11:55
    samedi 14 avril 2018 11:53