ItemsCollection的ContainerFromItem对于我确定在集合中的对象失败

时间:2019-02-08 22:11:24

标签: wpf itemscollection

我正在尝试向列表框添加搜索功能,该列表框将向下滚动到要搜索的项目。

我有一个绑定到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返回容器。我的代码是否有修复程序(或对问题的理解)?

迈克尔

1 个答案:

答案 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);

我确定我可以对其进行修改以使其更灵活,但这是第一个解决方法。