如何根据项目在屏幕上显示的顺序选择ListBox中的项目

时间:2012-10-02 18:40:39

标签: wpf listbox listboxitem

我的WPF应用程序中包含ListBoxListBox's ItemsSource属性设置为我定义的对象集合。这些都来自UserControl

我需要按照它们在屏幕上显示的顺序循环遍历ListBox中的项目。我相信我可以通过循环ListBox's Items集合来完成此操作。

我相信此集合中的对象属于ListBoxItem类型。如何从ListBoxItem获取我的类型的对象?换句话说,我如何从UserControl的{​​{1}}得到我班级的实例?

编辑:

我应首先包含的其他信息:

我需要按照它们出现在ListBoxItem中的顺序遍历Items,以便我可以选择最接近顶部的匹配特定条件的那个。在找到我感兴趣的那个之后,我需要选择它。这是一个选择ListBox,因此一次只能选择一个项目。

所以,我的问题是:我如何选择项目?

这并不重要,但我的类型来自ListBox的原因是因为它包含了许多需要在每个项目的UserControl中显示的控件。

3 个答案:

答案 0 :(得分:0)

Items正是您设置它们或ItemsSource到(它通常应该是数据对象,而不是UserControls),因此您只需要将它们转换为您的类型

  

这并不重要,但我的类型从UserControl下降的原因是因为它包含了许多需要在ListBox中为每个项目显示的控件。

那是不是一个很好的理由。在WPF中,您应该使用数据项并使用data bindingdata templating来显示具有相应控件的数据。

另外,要选择给定项目,数据项应具有IsSelected属性,然后可以将ItemsControl.ItemContainerStyle绑定到ListBoxItem.IsSelected属性。

如果您在项目上设置IsSelectedtrue,则也应选择相应的ListBoxItem(您需要在项目上实施INotifyPropertyChanged)。< / p>

答案 1 :(得分:0)

为什么不简单地选择符合条件的第一项:

Func<ItemType, bool> match =
    item =>
    {
        return ...; // a bool that indicates if the condition is matched
    };

listBox.SelectedItem = listBox.Items.Cast<ItemType>().FirstOrDefault(match);

答案 2 :(得分:0)

我发现我需要以相反的顺序遍历Items集合中的项目。我不确定为什么会这样,我认为Items集合按照它们在屏幕上显示的顺序保存了所有内容。也许是因为ListBox在底层数据的DateTime属性上按降序排序?

在任何情况下,由于我不得不向后循环,我最终必须编写一个for循环,该循环从集合的末尾开始并向前推进。由于我现在拥有了我想要选择的项目的索引,因此很容易将ListBox.SelectedIndex设置为该索引。