WPF ListBox中的滚动条问题

时间:2016-04-20 06:35:23

标签: wpf listbox infragistics listboxitem xamdatagrid

我们正在开发字段选择器,并使用自定义代码在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>

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

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

    }

我们也取代了Grid代替了Stack面板。但添加网格后,文本更改事件抛出“对象引用错误”

我们所描述的问题的原因包含在我们正在使用的搜索TextBox的TextChanged事件中。 抛出空引用异常,因为并非ListBox中的所有项目当前都可视化,这样ContainerFromItem方法无法将它们全部作为可视元素找到。因为我们已经用Grid替换了StackPanel。

1 个答案:

答案 0 :(得分:0)

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

您可以使用lb.ItemSource而不是在foreach中使用ListBox.Items,然后您只需要将FieldChooserEntry中的项目投放到if中?

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

对于Grid的错误,您可能想要检查Children[1]是否实际上是ListBox。 Grid和StackPanel中的控件顺序可能不同。

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