我正在尝试向列表框添加搜索功能,该列表框将向下滚动到要搜索的项目。
我有一个绑定到ObservableCollection的ListBox,我用一堆RecipeNameDTO对象填充了它。通过简单的搜索,我可以轻松地在Items集合中找到一个对象。
string searchItem = tbSearchString.Text;
var recipenameitem = lbRecipeNames.Items.Cast<DTO.RecipeNameDTO>().Where(u => u.RecipeName.ToLower().Contains(searchItem.ToLower())).FirstOrDefault();
我可以用这种方法可重复地找到物品。
但是,如果我随后尝试使用ContainerFromItem查找对象的容器,则方法将返回null,除非当我执行该方法时在ListBox中可见该对象:
ListBoxItem lbi = (ListBoxItem)lbRecipeNames.ItemContainerGenerator.ContainerFromItem(recipenameitem);
在执行ContainerFromItem之前,我确定(我认为)实际对象存在于ItemsCollection中,因为我使用了本文开头记录的搜索结果为非空结果。另外,我可以向下滚动ListBox并找到要搜索的对象。
它必须与ListBox缓存ItemsCollection中的对象的方式有关,这会阻止ContainerFromItem返回容器。我的代码是否有修复程序(或对问题的理解)?
迈克尔
答案 0 :(得分:0)
我接受了安迪的建议,将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);
我确定我可以对其进行修改以使其更灵活,但这是第一个解决方法。