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.