如何从嵌套的ListBoxItem中获取ComboBox SelectionChanged事件?

时间:2009-10-27 18:21:20

标签: wpf events combobox listbox nested

这是一个相当复杂的问题,让我现在真的很困惑。任何帮助将不胜感激。

设置:
TypeA UserControls的ListBox   - > TypeA UserControl的ListBoxItem
  - > B类UserControls的ListBox  ---> B类UserControl的ListBoxItem
 ----> Type C用户控件的ListBox
 -----> Type C UserControl的ListBoxItem(包含ComboBox)

换句话说,Type A控件有一个B类控件的ListBox,它有一个TypeBox控件的ListBox。所有控件本质上都是分层的。类型A包含加载类型B控件所需的数据,类型B包含加载类型C控件所需的数据。 Type C控件中有一个标准的ComboBox,用于更改当前项的值。除了上述结构之外,我还在Type A和Type B UserControl级别上拖放绑定到PreviewMouseLeftButtonDown事件,以处理GUI中的重新排序/删除/ etc命令。所有这些都按预期工作。

问题:
当我尝试更改ComboBox中的值时,SelectionChanged事件永远不会在Type C“级别”上触发,除非我非常小心地点击任何A类或B类控件之间的边框/间距。当我的ComboBox弹出菜单与位于其下方的Type A或B控件重叠时,会发生这种情况。类型A或B的选择事件是触发而不是类型C事件,因此ComboBox永远不会可靠地更改其值。在调试器中,用于处理拖放的代码在位于ComboBox下面的下一个ListBoxItem上触发。

思想:
有没有一种方法可以让我的ComboBox弹出窗口在它后面的项目中占据主导地位,同时双重嵌套在ListBox中(即,在它打开时忽略它背后的任何东西)? 有没有办法将错误触发的SelectionChanged事件重新路由到应该触发它们的ComboBox?

1 个答案:

答案 0 :(得分:0)

所以我想出了答案。我必须向Type A和B控件添加一个属性,以递归方式检查是否有任何ComboBox打开。当拖放功能内部发生任何选择事件时,我会在处理拖放之前检查属性。如果有任何ComboBox打开,我只需调用Exit Sub并正确处理click事件。