【问题标题】:One command, 2 possible command targets一个命令,2 个可能的命令目标
【发布时间】:2014-05-23 21:41:03
【问题描述】:

以下情况:我有 2 个 ListBox,每个都包含一个单独的可移除元素列表。

如果我现在要添加一个删除命令(当我将所选元素作为 OriginalSource 时,这对 ContextMenu 工作正常),我遇到的问题是我无法区分哪个 ListBox 是指(因为 OriginalSource 是窗口)。

即使为 listBoxes 触发了 GotFocus 事件,使用 FocusManager 也不起作用(始终返回 null)。

一个简单的解决方案是将选定的 ListBox 存储在 GotFocus 事件中,但我正在寻找一个更通用、可扩展的解决方案(因此我从提供给命令的 CanExecute/Execute 方法的参数中获取所有信息)

【问题讨论】:

  • 默认情况下CommandTarget 将成为焦点元素,然后它会沿着可视化树向上查找一些CommandBinding。你的每个Listbox 可以有不同的CommandBinding
  • 您可以做的是为每个列表框创建两个按钮。然后使用CommandParameter可以区分是哪个列表框发送了删除Command

标签: c# wpf command


【解决方案1】:

您可以在视图模型上提供 LastSelectedItem 属性。当您从列表框中设置 SelectedItems 之一时,始终设置此属性。然后在您的两个列表中搜索该项目并将其删除。

【讨论】:

  • 这种方法有一个小缺陷。从列表框中选择一个项目而不是单击删除按钮命令后,如果用户单击窗口上的其他位置,然后单击删除按钮,则该项目将被删除。只有在用户选择一个项目然后单击删除按钮后,才应启用该按钮。对于任何其他情况,应禁用该按钮。
  • 或者把按钮放到ListBox的ItemTemplate里面。这样就毫无疑问应该删除哪个项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2021-09-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多