0

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

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

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

由于当项目不可见但项目当前位于列表框中时,此方法返回 null。
不知何故,我猜项目 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

4

1 回答 1

0

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

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

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

于 2016-07-12T16:06:05.707 回答