2016-07-12 2 views
0

Я пытаюсь выделить часть текста в текстовом блоке из таблицы данных listbox, которая, в свою очередь, ограничена свойством пользовательского класса, используя текстовое поле для поиска в списке для ввода текста.

Но проблема в том, что выделяется только часть элементов (большинство из них видны), но когда я максимизирую окно и пытаюсь ввести другого персонажа, тогда внезапно все они будут подсвечены моей догадкой, где проблема может быть в этом кусок кода:Выделите часть текста в текстовом блоке, не работающем во всех listboxItems

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

Поскольку этот метод возвращает нуль, когда элементы не видны, но детали в настоящее время в ListBox.
Как-то я догадываюсь, что экземпляры 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, ограниченный пользовательским элементом, просто дайте мне знать. Большое спасибо!

[Pic проблемы] http://i.stack.imgur.com/HViag.png

+0

Да, 'ListBoxItem' создаются по мере необходимости по умолчанию. Это улучшает использование и производительность памяти. Почему вам нужно найти «ListBoxItem», чтобы выделить часть текста в нем? – Andy

+0

Привет, за ваш быстрый ответ. Потому что мне нужно найти текстовый блок (выделить текст), связанный с этим listboxItem (который связан с пользовательским классом), поскольку текстовый блок находится в dataTemplate и недоступен в коде. Что ты предлагаешь? Может быть, если есть способ заставить все экземпляры listboxItems? если вам нужно больше кода, я могу отправить вас, чтобы мы лучше поняли. – Merv

+0

Подсветка имеет смысл только для видимых элементов – AnjumSKhan

ответ

0

Один из способов исправить это установить VirtualizingStackPanel.IsVirtualizing в false для ListBox. Это приведет к тому, что все элементы будут созданы сразу. Недостатком этого является то, что у вашего ListBox есть много предметов, ваша программа будет использовать больше памяти (так как будет создано больше элементов), и может потенциально работать медленнее в зависимости от количества элементов.

Лучшим решением для рассмотрения было бы иметь несколько DataTemplate s для этого - один без подсветки и один с. Вы можете установить DataTemplateSelector для вашего ListBox (используя свойство ItemTemplateSelector). Селектор может выбрать, какой шаблон использовать, исходя из того, соответствует ли элемент поисковому запросу или нет.

Трудная часть будет писать шаблон с выделенным текстом. Вероятно, вы достигнете этого, получив свойства объекта: ListBoxItem привязан к тексту перед выделенным текстом, выделенным текстом, а затем оставшимся текстом.

+0

Это решило мою проблему подсветки, но, как вы сказали, она использует больше памяти, и ваше второе предложение потеряло меня. Большое спасибо! На данный момент я использую ваше первое исправление. Я буду ждать больше ответов, если не тогда, я буду отмечать его как один. Еще раз спасибо! – Merv

Смежные вопросы