WPF列表框中的滚动条问题

WPF列表框中的滚动条问题,wpf,listbox,infragistics,listboxitem,xamdatagrid,Wpf,Listbox,Infragistics,Listboxitem,Xamdatagrid,我们正在开发字段选择器,并使用自定义代码在xamDataGrid的字段选择器中获得搜索功能。 我们使用文本框进行搜索,使用列表框保存字段选择器的字段。 我们使用的代码: <StackPanel> <TextBox TextChanged="TextBox_TextChanged" /> <ListBox x:Name="PART_FieldsListBox" ItemsSource="{TemplateBinding CurrentF

我们正在开发字段选择器,并使用自定义代码在xamDataGrid的字段选择器中获得搜索功能。 我们使用文本框进行搜索,使用列表框保存字段选择器的字段。 我们使用的代码:

    <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>

我知道问题出在堆栈面板上。但由于文本搜索代码,我们无法删除堆栈面板。 我们使用的搜索代码:

    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;
            }

    }
private void TextBox\u TextChanged(对象发送者,textchangedventargs e)
{
ListBox lb=((发送方作为TextBox.Parent作为StackPanel.Children[1]作为ListBox);
foreach(lb.ItemsSource中的var项作为ReadOnlyObservableCollection)
{
ListBoxItem ListBoxItem=(lb.ItemContainerGenerator.ContainerFromItem(item)作为ListBoxItem);
if((发件人作为文本框).Text.ToString()!=“”)
{
if(item.Field.Label.ToString().ToLower().Contains((发送者为TextBox.Text.ToLower())包含)
listBoxItem.Visibility=可见性.Visibility;
其他的
listBoxItem.Visibility=可见性。折叠;
}
其他的
listBoxItem.Visibility=可见性.Visibility;
}
}
我们还用网格代替了堆栈面板。但在添加网格后,文本更改事件抛出“对象引用错误”

我们所描述的问题的原因包含在我们正在使用的搜索文本框的TextChanged事件中。
引发null引用异常,因为并非ListBox中的所有项当前都是可视化的,这样ContainerFromItem方法就无法将它们全部作为可视化元素找到。由于我们已将StackPanel替换为网格。

由于没有适用于FieldChooseEntry和其他元素的代码,我建议如下:

您是否可以使用
列表框.Items
,而不是在
foreach
中使用
lb.ItemSource
,然后您只需要在
if
中将该项强制转换为
字段选择尝试

这样可以避免
ItemContainerGenerator
的复杂性,这可能不是获取项目的最佳方法。它可能会导致虚拟化问题

至于网格的错误,您可能需要检查
子项[1]
是否实际上是列表框。Grid和StackPanel中控件的顺序可能不同


如果您需要更多详细信息,或者这仍然无法解决问题,则可能需要发布FieldChooseEntry对象的代码-至少是结构。

如果您已使用网格替换StackPanel。您是否已将
.Parent as StackPanel
更改为
.Parent as Grid
?是的,我已更改.Parent as Grid。通过以下代码强制转换后,我不会获得列表框项。ListBox lb=((发送者作为文本框。父对象作为网格)。子对象[1]作为ListBox);foreach(lb.Items中的var item){ListBoxItem ListBoxItem=item as ListBoxItem;}我建议在
ListBox lb=…
行上设置一个断点,并查看子项列表,以查看哪个是ListBox.lb.Items即将到来的字段chooserentry。当我们将其强制转换为ListBox项时,ListBoxItem为null。因为我们无法将FieldChooserEntry直接转换为ListBoxItem。然后您可以将其转换为FieldChooserEntry。