繁体   English   中英

WPF ListBox.SelectedItems作为ListBoxItem

[英]WPF ListBox.SelectedItems as ListBoxItem

有没有办法有一个的选择的项目ListBoxListBoxItem事件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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM