[英]WPF ListBox.SelectedItems as ListBoxItem
有没有办法有一个的选择的项目ListBox
为ListBoxItem
事件SelectionChanged
(在ListBox
在WPF)?
现在,当我调用listBox.SelectedItems
时, listBox.SelectedItems
数据源的格式获取项目列表。
例如,当我创建我的ListBox
我将其绑定到CustomListBoxViewModel
作为数据源,因此,当我调用SelectedItems
我会得到一个CustomListBoxViewModel
对象的列表。
谢谢!
编辑:
所选答案中给出的代码非常适合我的用例。
另一方面,我完全理解这违反了MVVM模式。 我将使用您在xaml视图后面的代码中提供的代码。
我的原始问题背后的原因是,我需要实现一个ListBox
,该ListBox
内部具有一些禁用的ListBoxItems
。 这些项目将必须是不可选择的。
我尝试在ListBoxItems
上使用附加属性IsSelectable ,但效果不佳。 此附加属性受此职位的启发。 问题是,当我直接选择一个禁用的项目时,附加属性可以完美运行。 无法选择该项目,并且该项目不在SelectedItems集合内。 但是,如果我想通过按CTRL + A来选择所有项目,则所有ListBoxItems
被选中,甚至禁用的项目也会在SelectedItems集合中找到。
无论出于什么原因,这可能是对MVVM的严重违反,您终生都会为之感到遗憾。
但是,迈向灭绝之路的第一步始终很容易。
这是如何做:
var listBox = (ListBox)sender;
var selectedListBoxItems =
listBox.SelectedItems.Cast<Object>()
.Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item))
.ToList();
当一切都以眼泪结束时,别哭了。
没错,但很认真,在WPF中有很多充分的理由来做这种事情,但是它们远不如WPF初学者所期望的那么普遍。 通过使C#代码仅与数据项交互,并通过样式和模板对XAML中的ListBoxItem进行处理,可以最好地处理几乎所有正常情况。 一旦习惯了这种思维方式,它就会非常强大,灵活,高效且可维护。 当所有其他合理途径均失败时,Codebehind是您为奇数情况所采取的措施。 例如,拖放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.