Tea*_*Dev 6 .net com wpf treeview event-bubbling
我有一个TreeView绑定到一个层次结构,通过HierarchicalDataTemplates 包含几个不同的类.当选择树中的项目时,SelectedItemChanged事件当然会愉快地通过父项向上冒泡,就像它应该的那样.它应该有什么不能做的,但仍然没有,正高兴地保持在起泡后,我设置e.Handled到true.
该事件仍将在父项上触发,其RoutedPropertyChangedEventArgs外观与所选的父项完全相同; 甚至OriginalSource属性也将指向父项,而不是最初选择的项.e.Handled当然会false.
几乎同样的问题在这里被问到,但我没有使用EventAggregator或CAL,这里找到的解决方法没有多大帮助,因为我并不是专门针对鼠标事件.
有没有办法精确地获得实际选择的项目或强行停止冒泡的疯狂(不使用我能想到的全局变量的非常暴力和不道德的黑客)?
感谢您的任何见解.
读完 Rick 的回答后,我与一位同事交谈,结果发现他以前也遇到过同样的问题。我在我的应用程序中尝试了各种方法(发现:TreeViewItem.Selected 事件的行为完全相同)和一个测试项目,并发现在测试应用程序中事件的触发与人们的预期完全一致。因此,环境中一定存在显着差异(XAML 和 ViewModel 类几乎相同),从而导致了这种行为差异 - 而罪魁祸首似乎是 COM,它恰好在 COM 应用程序中托管 WPF 控件。
我同事的应用程序是使用 VSTO 的 Word 扩展,而我的应用程序是 Visual Studio 2010 的 VSPackage - 并且 Word 和 VS2010 大部分仍然是本机代码。另一方面,我的测试应用程序当然是一个小型的普通 WPF 项目。我添加了一个带有 ElementHost 的 WinForms 表单,该表单又托管了一个带有 TreeView 的 UserControl,但它仍然按预期工作,所以对我来说,它确实看起来像是主机 COM 应用程序以某种方式干扰了在TreeView 和 TreeViewItems。
幸运的是,我的同事找到/谷歌搜索了一个暂时可行的解决方案 - 在完成对事件的实际反应后,在事件处理程序方法的末尾,再次将 TreeViewItem 设置为选定状态并聚焦它:
item.Focus();
item.IsSelected = true;
Run Code Online (Sandbox Code Playgroud)
我们不明白为什么,但这将阻止错误地重新选择项目(这显然不是 WPF 意义上的冒泡事件)。
再次感谢 Rick 推动我将 TreeView 和 TreeViewItem 事件分开。
| 归档时间: |
|
| 查看次数: |
3665 次 |
| 最近记录: |