突出显示文本块中的部分文本不适用于所有 listboxItems

Highlight part of text in textblock not working on all listboxItems

我试图通过使用文本框搜索列表来突出显示列表框数据模板中文本块中的部分文本,而列表框数据模板又绑定到自定义 class 的 属性输入文本。

但问题是只有部分项目突出显示(大部分可见)但是当我最大化 window 并尝试输入另一个字符时突然所有这些都被突出显示我猜问题可能出在这段代码中:

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

因为当项目不可见但项目当前位于列表框中时,此方法返回空值。
不知何故,我猜项目 listboxItem 实例尚未创建,直到您向下滚动或最大化以查看更多项目。

XAML 数据模板:

<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

解决此问题的一种方法是将 ListBoxVirtualizingStackPanel.IsVirtualizing 设置为 false。这将立即创建所有项目。这样做的缺点是,如果您的 ListBox 有很多项目,您的程序将使用更多内存(因为将创建更多项目),并且可能 运行 变慢,具体取决于项目的数量。

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

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