ItemsCollection в ContainerFromItem завершается ошибкой для объекта, который, я уверен, находится в коллекции - PullRequest
0 голосов
/ 09 февраля 2019

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

У меня есть ListBox, который связан с ObservableCollection, который я заполнил кучей объектов RecipeNameDTO,Я легко могу найти объект в коллекции Предметов с помощью простого поиска.

string searchItem = tbSearchString.Text;
var recipenameitem = lbRecipeNames.Items.Cast<DTO.RecipeNameDTO>().Where(u => u.RecipeName.ToLower().Contains(searchItem.ToLower())).FirstOrDefault();

Я могу воспроизводимо найти предметы с помощью этого метода.

Однако, если я тогда попытаюсь найти контейнер объектаиспользуя ContainerFromItem, метод возвращает нулевое значение, если только объект не отображается в ListBox при выполнении метода:

ListBoxItem lbi = (ListBoxItem)lbRecipeNames.ItemContainerGenerator.ContainerFromItem(recipenameitem);

Я уверен (я думаю), что фактический объект существует вItemsCollection перед выполнением ContainerFromItem, потому что я использую ненулевой результат поиска, который я задокументировал в начале этого поста.Кроме того, я могу прокрутить ListBox вниз и найти искомый объект.

Должно быть, что-то вроде способа, которым ListBox кэширует объекты в ItemsCollection, который не позволяет ContainerFromItem возвращать контейнер.Есть ли исправление в моем коде (или понимание проблемы)?

Майкл

1 Ответ

0 голосов
/ 09 февраля 2019

Я принял предложение Энди и сделал свой ListBox IsSynchronizedWithCurrent = True, а затем использовал следующий код для установки текущего элемента и прокрутки его в поле зрения:

    string searchItem = tbSearchString.Text;

    CollectionViewSource cvs = (CollectionViewSource)this.FindResource("cvsRecipeName");
    ObservableCollection<DTO.RecipeNameDTO> itemsCollection = (ObservableCollection<DTO.RecipeNameDTO>)cvs.Source;

    List<DTO.RecipeNameDTO> recipenameitems = itemsCollection.Where(u => u.RecipeName.ToLower().Contains(searchItem.ToLower())).ToList();
    if (recipenameitems.Count > 0) { cvs.View.MoveCurrentTo(recipenameitems[0]);}

    lbRecipeNames.ScrollIntoView(lbRecipeNames.SelectedItem);

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

...