【问题标题】:WPF ListBox.SelectedItems as ListBoxItemWPF ListBox.SelectedItems 作为 ListBoxItem
【发布时间】:2016-10-27 19:29:45
【问题描述】:

有没有办法在 WPF 中的事件 SelectionChanged(在 ListBox 上)中将 ListBox 的选定项目作为 ListBoxItem

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

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

谢谢!

编辑:

所选答案中给出的代码非常适合我的用例。

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

我最初的问题背后的原因是我需要实现一个ListBox,其中有一些禁用的ListBoxItems。这些项目必须是不可选择的。

我尝试在 ListBoxItems 上使用附加属性 IsSelectable,但效果不佳。此附加属性受到post 的极大启发。问题是当我直接选择一个禁用的项目时,附加的属性工作得很好。无法选择该项目并且它不在 SelectedItems 集合中。但是,如果我想通过按 CTRL+A 来选择所有项目,则所有 ListBoxItems 甚至被禁用的项目都被选中,并且在 SelectedItems 集合中找到。

【问题讨论】:

  • 不,这不是它的工作原理。
  • @Will 我会用我想要这样做的原因更新问题。这是我想到的“最好”的做法……也许有更好的做法?

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


【解决方案1】:

无论您出于什么原因这样做,都可能是对 MVVM 的严重违反,您会为此后悔终生。

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

方法如下:

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

当一切都以泪水告终时,请不要向我哭泣。

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

【讨论】:

  • 我完全明白这很糟糕。我在问题的编辑中添加了我问这个的原因。也许有更好的方法来做到这一点。
  • @m.lachance 阅读您更新的问题时,我的第一反应是“哦,伙计,把它放在代码隐藏中”。这绝对是您在代码隐藏中经常做的事情——附加属性解决方案可能更好,但现实世界的时间表通常不允许您构建帕台农神庙。但偷走帕台农神庙是另一回事。我会看一下 coderelief.net 的帖子,看看该代码是否适合我。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多