gpt4 book ai didi

.net - 处理的 TreeView.SelectedItemChanged 事件仍然冒泡

转载 作者:行者123 更新时间:2023-12-04 15:26:36 24 4
gpt4 key购买 nike

我有一个 TreeView 通过 HierarchicalDataTemplate 绑定(bind)到由几个不同类组成的层次结构。当树中的一个项目被选中时,SelectedItemChanged 事件当然会愉快地通过父项目向上冒泡,这是应该的。在我将 e.Handled 设置为 true 之后,它不应该做但仍然会做的事情是愉快地继续冒泡。

该事件仍将在父项上触发,并且 RoutedPropertyChangedEventArgs 看起来与被选中的父项完全相同;甚至 OriginalSource 属性也会指向父项,而不是最初选择的那个。 e.Handled 当然是 false

几乎相同的问题被问到 here ,但我没有使用 EventAggregator 或 CAL,并且发现 here 的解决方法没有多大帮助,因为我不是专门在鼠标事件之后。

有什么方法可以精确地获取实际选择的项目或强制停止冒泡的疯狂(无需使用我能想到的全局变量进行非常暴力和不道德的黑客攻击)?

感谢您的任何见解。

最佳答案

在阅读了 Rick 的回答后,我与一位同事交谈,结果发现他之前也遇到过同样的问题。我在我的应用程序中尝试了各种事情(发现:TreeViewItem.Selected 事件的行为方式完全相同)和一个测试项目,发现在测试应用程序中,事件的触发完全符合人们的预期。因此,导致这种行为差异的环境必须存在显着差异(XAML 和 ViewModel 类几乎相同)——罪魁祸首似乎是 COM,它在 COM 应用程序中精确托管 WPF 控件。

我同事的应用程序是使用 VSTO 的 Word 扩展,而我的应用程序是 Visual Studio 2010 的 VSPackage - Word 和 VS2010 在大多数情况下仍然是 native 代码。另一方面,我的测试应用程序当然是一个小型的普通 WPF 项目。我向其中添加了一个带有 ElementHost 的 WinForms 表单,该表单又托管了一个带有 TreeView 的 UserControl,但它仍然可以正常工作,所以在我看来,主机 COM 应用程序确实以某种方式干扰了在 TreeView 和 TreeView 项。

幸运的是,我的同事找到/搜索了一个暂时可行的解决方案 - 在您完成对事件的实际 react 之后,在事件处理程序方法结束时,再次将 TreeViewItem 设置为选中并关注它:

item.Focus();
item.IsSelected = true;

我们不明白为什么,但这将阻止项目被错误地重新选择(这显然不是 WPF 意义上的真正冒泡事件)。

再次感谢 Rick 插入我将 TreeView 和 TreeViewItem 事件分开。

关于.net - 处理的 TreeView.SelectedItemChanged 事件仍然冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6117578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com