我们正在开发字段选择器,并使用自定义代码在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。
答案 0 :(得分:0)
由于FieldChooserEntry和其他元素没有可用的代码,我建议如下:
您可以使用lb.ItemSource
而不是在foreach
中使用ListBox.Items
,然后您只需要将FieldChooserEntry
中的项目投放到if
中?
通过这种方式,您可以避免ItemContainerGenerator
的复杂性,这可能不是获取项目的最佳方式。它可能会导致虚拟化问题。
对于Grid的错误,您可能想要检查Children[1]
是否实际上是ListBox。 Grid和StackPanel中的控件顺序可能不同。
如果您需要更多详细信息或者仍然无法解决问题,您可能需要发布FieldChooserEntry对象的代码 - 至少是结构。