2 votes

Problème de barre de défilement dans une ListBox WPF

Nous travaillons sur le sélecteur de champs et nous avons utilisé un code personnalisé pour obtenir la fonctionnalité de recherche dans le sélecteur de champs de xamDataGrid. Nous avons utilisé une zone de texte pour la recherche et une zone de liste pour conserver les champs du sélecteur de champ. Le code que nous avons utilisé :

    <StackPanel>
    <TextBox TextChanged="TextBox_TextChanged" />
        <ListBox x:Name="PART_FieldsListBox" ItemsSource="{TemplateBinding CurrentFields}" SelectionMode="Single" SelectedItem="{Binding Path=SelectedField, RelativeSource={x:Static RelativeSource.TemplatedParent}, Mode=TwoWay}" HorizontalContentAlignment="Stretch">
                <ListBox.ItemContainerStyle>
                        <Style TargetType="{x:Type ListBoxItem}">
                                 <Setter Property="FocusVisualStyle" Value="{x:Null}" />
                                     <Setter Property="Template">
                                     <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                         <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                             </Border>
                                             </ControlTemplate>
                                     </Setter.Value>
                                     </Setter>
                             </Style>
                      </ListBox.ItemContainerStyle>
            <ListBox.InputBindings>
            <KeyBinding Key="Space" Command="{x:Static igDP:FieldChooserCommands.ToggleVisibility}"/>
            </ListBox.InputBindings>
            </ListBox>

Je sais que le problème est le panneau Stack. Mais en raison du code de recherche de texte, nous ne pouvons pas supprimer le panneau de pile. Le code de recherche que nous avons utilisé :

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
            ListBox lb = (((sender as TextBox).Parent as StackPanel).Children[1] as ListBox);
            foreach (var item in lb.ItemsSource as ReadOnlyObservableCollection<FieldChooserEntry>)
            {
                ListBoxItem listBoxItem = (lb.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem);
                if ((sender as TextBox).Text.ToString() != "")
                {
                    if (item.Field.Label.ToString().ToLower().Contains((sender as TextBox).Text.ToLower()))
                        listBoxItem.Visibility = Visibility.Visible;
                    else
                        listBoxItem.Visibility = Visibility.Collapsed;
                }
                else
                    listBoxItem.Visibility = Visibility.Visible;
            }

    }

Nous avons également remplacé le panneau Stack par le panneau Grid. Mais après l'ajout de la grille, l'événement de changement de texte génère une "erreur de référence d'objet"

La raison du problème que nous avons décrit est contenue dans l'événement TextChanged de la boîte de texte de recherche que nous utilisons. Une exception de référence nulle est levée parce que tous les éléments à l'intérieur de la ListBox ne sont pas encore visualisés et que la méthode ContainerFromItem n'est donc pas en mesure de les trouver tous en tant qu'éléments visuels. Puisque nous avons remplacé le StackPanel par une Grid.

0voto

Dax Pandhi Points 803

Comme il n'y a pas de code disponible pour votre FieldChooserEntry et d'autres éléments, je suggère ce qui suit :

Au lieu d'utiliser lb.ItemSource dans le foreach pouvez-vous utiliser ListBox.Items et vous n'aurez alors qu'à lancer l'élément en tant que FieldChooserEntry dans le if ?

De cette façon, vous évitez la complexité de la ItemContainerGenerator ce qui n'est peut-être pas la meilleure façon d'obtenir les articles. Cela peut causer des problèmes avec la virtualisation.

En ce qui concerne l'erreur avec la grille, vous pouvez vérifier si Children[1] est en fait la ListBox. L'ordre des contrôles dans la grille et le StackPanel peut être différent.

Si vous avez besoin de plus de détails ou si cela ne résout toujours pas le problème, vous devrez peut-être envoyer le code de votre objet FieldChooserEntry - au moins la structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X