突出显示textblock中不适用于所有listboxItem

时间:2016-07-12 14:47:49

标签: c# wpf listbox datatemplate itemcontainergenerator

我正在尝试从listbox datatemplate突出显示文本块中的部分文本,而后者又通过使用文本框在列表中搜索输入文本来限制自定义类的属性。

但问题是只有部分项目突出显示(大多数项目可见)但是当我最大化窗口并尝试输入另一个角色时突然所有这些都突出显示我的猜测问题可能出在这一块中代码:

ListBoxItem listboxItemFound= (ListBoxItem)this.listBox1.ItemContainerGenerator.ContainerFromItem(TItem);

由于此项方法在项目不可见但项目当前位于列表框中时返回null。
不知怎的,我想在你向下滚动或最大化以查看更多项目之前,尚未创建项目listboxItem实例。

XAML DataTemplate:

<DataTemplate>
  <Grid Name="gridOfListbox" Height="25" Margin="0,2">
    <DockPanel Name="dockpanelWithTxtBlock">
      <TextBlock Name="textbloxk" DockPanel.Dock="Left" FontSize="15" TextAlignment="Center">
        <Run Text="" /><Run Background="Yellow" Text="" /><Run Text="{Binding ProductID}" />
      </TextBlock>
    </DockPanel>
  </Grid>
</DataTemplate>

如果需要更多代码,请告诉我 任何帮助将不胜感激!!
此外,如果有任何其他更好的方法找到限制自定义项目的listboxItem,请告诉我。非常感谢你!

[问题图片] http://i.stack.imgur.com/HViag.png

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是为falseVirtualizingStackPanel.IsVirtualizing设置为ListBox。这将导致立即创建所有项目。这样做的缺点是如果你的ListBox有很多项目,你的程序将使用更多的内存(因为会创建更多的项目),并且根据项目的数量可能会运行得更慢。

要考虑的更好的解决方案是为此设置多个DataTemplate - 一个没有突出显示,一个没有突出显示。您可以为ListBox设置DataTemplateSelector(使用ItemTemplateSelector属性)。选择器可以根据项目是否与搜索词匹配来选择使用哪个模板。

棘手的部分是使用突出显示的文本编写模板。您可以通过在突出显示的文本,突出显示的文本以及剩余文本之前为ListBoxItem绑定的对象上的属性来实现此目的。