我的WPF应用程序中包含ListBox
。 ListBox's
ItemsSource
属性设置为我定义的对象集合。这些都来自UserControl
。
我需要按照它们在屏幕上显示的顺序循环遍历ListBox
中的项目。我相信我可以通过循环ListBox's
Items
集合来完成此操作。
我相信此集合中的对象属于ListBoxItem
类型。如何从ListBoxItem
获取我的类型的对象?换句话说,我如何从UserControl
的{{1}}得到我班级的实例?
编辑:
我应首先包含的其他信息:
我需要按照它们出现在ListBoxItem
中的顺序遍历Items
,以便我可以选择最接近顶部的匹配特定条件的那个。在找到我感兴趣的那个之后,我需要选择它。这是一个选择ListBox
,因此一次只能选择一个项目。
所以,我的问题是:我如何选择项目?
这并不重要,但我的类型来自ListBox
的原因是因为它包含了许多需要在每个项目的UserControl
中显示的控件。
答案 0 :(得分:0)
Items
正是您设置它们或ItemsSource
到(它通常应该是数据对象,而不是UserControls
),因此您只需要将它们转换为您的类型
这并不重要,但我的类型从UserControl下降的原因是因为它包含了许多需要在ListBox中为每个项目显示的控件。
那是不是一个很好的理由。在WPF中,您应该使用数据项并使用data binding和data templating来显示具有相应控件的数据。
另外,要选择给定项目,数据项应具有IsSelected
属性,然后可以将ItemsControl.ItemContainerStyle
绑定到ListBoxItem.IsSelected
属性。
如果您在项目上设置IsSelected
至true
,则也应选择相应的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
设置为该索引。