WPF ListBox.SelectedItems作为ListBoxItem

时间:2016-10-27 19:29:46

标签: c# wpf xaml data-binding wpf-controls

是否可以在WPF中ListBoxListBoxItem)事件中将SelectionChanged的所选项目作为ListBox

现在,当我拨打listBox.SelectedItems时,我会以数据源的格式获取项目列表。

例如,当我创建ListBox时,我将其绑定到CustomListBoxViewModel作为数据源,因此当我调用SelectedItems时,我会得到CustomListBoxViewModel个对象的列表

谢谢!

编辑:

所选答案中给出的代码完全适用于我的用例。

另一方面,我完全理解这违反了MVVM模式。我将使用您在xaml视图后面的代码中提供的代码。

我原来的问题背后的原因是我需要实现一个ListBox内部有一些禁用ListBoxItems。那些物品必须是不可选择的。

我尝试在ListBoxItems上使用附加属性 IsSelectable ,但效果不佳。这个附属的财产受到了这个post的启发。问题是,当我直接选择一个禁用的项目时,附加的属性工作得很好。无法选择该项,它不在 SelectedItems 集合中。但如果我想通过按CTRL + A选择所有项目,则所有ListBoxItems都被选中,即使是已禁用的项目,也可以在 SelectedItems 集合中找到。

1 个答案:

答案 0 :(得分:4)

无论你为此做出什么样的理由,这可能是对MVVM的严重侵犯,你会对你的余生感到非常后悔。

但走向灭亡之路的第一步总是很容易。

以下是:

var listBox = (ListBox)sender;
var selectedListBoxItems = 
    listBox.SelectedItems.Cast<Object>()
    .Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item))
    .ToList();

当泪水全部结束时,请不要向我哭泣。

不,但严重的是,在WPF中做这种事情的一些很好的理由,但它们远没有WPF所期望的人那么普遍。几乎任何正常情况最好通过让您的C#代码仅与您的数据项交互来处理,并通过样式和模板对XAML中的ListBoxItems进行处理。一旦你习惯了这种思维方式,它就会变得非常强大,灵活,高效且易于维护。当所有其他合理途径都失败时,Codebehind就是你所做的奇怪案例。例如,拖放。