WPF列表框中的滚动条问题
我们正在开发字段选择器,并使用自定义代码在xamDataGrid的字段选择器中获得搜索功能。 我们使用文本框进行搜索,使用列表框保存字段选择器的字段。 我们使用的代码: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
<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。