You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF TreeView路径选择选中项时出现自动回退问题

TreeView通过TextBox设置选中项时的回退问题

我正在实现一个TreeView,通过TextBox输入路径来获取/设置TreeView的SelectedItem。当输入从未选中/展开过的分支节点路径时,每次都能正常工作;但输入已选中过的分支或节点路径时,TreeView会毫无缘由地立即重新选中之前的项。

这是我在第3个基于.NET Core 6的项目中遇到此问题,试过MSDN和Stack Overflow上能找到的所有解决方案都无效,每次都得从零重写代码排查。

我尝试过手动聚焦/失焦TreeViewItem,但没有作用。


日志排查结果

为排查问题,我在MainWindowVM.TreeView_SelectedItemChanged和TreeNode.IsSelected的setter中添加断点输出日志:

鼠标点击TreeView项时的日志

"Root/Node0".IsSelected = true
SelectedItemChanged: null => "Root/Node0"   {System.Windows.Controls.TreeView Items.Count:4}
//                   ^^^^    ^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//              prev. path     new path        e.OriginalSource

//   clicking another item:
"Root/Node0".IsSelected = false
"Root/Node1".IsSelected = true
SelectedItemChanged: "Root/Node0" => "Root/Node1"   {System.Windows.Controls.TreeView Items.Count:4}

此时代码运行符合预期:前一项(若存在)取消选中,新项选中,SelectedItemChanged事件正常触发。

使用TextBox设置选中项时的日志

// Continuing from the previous log, "Root/Node1" is selected & expanded.
// I then append "/Node2" to the path. It's visible but hasn't been selected before:  
"Root/Node1/Node2".IsSelected = true
"Root/Node1".IsSelected = false
SelectedItemChanged: "Root/Node1" => "Root/Node1/Node2"   {System.Windows.Controls.TreeView Items.Count:4}
// Success. Nothing abnormal occurred.
// And then I try to remove "/Node2" from the path...
"Root/Node1".IsSelected = true
"Root/Node1/Node2".IsSelected = false
"Root/Node1".IsSelected = false
"Root/Node1/Node2".IsSelected = true
SelectedItemChanged: "Root/Node1" => "Root/Node1/Node2"   {System.Windows.Controls.TreeView Items.Count:4}
// ...and it gets instantly reverted.

TreeView会直接回退选中状态,之后触发SelectedItemChanged事件。选择已可见的子节点时也会出现相同问题:

// Again continuing from the previous log, I click on "Node1" with the mouse
"Root/Node1/Node2".IsSelected = false
"Root/Node1".IsSelected = true
SelectedItemChanged: "Root/Node1/Node2" => "Root/Node1"   {System.Windows.Controls.TreeView Items.Count:4}
// And again, nothing abnormal occurs.
// Then I try appending "/Node2" to the path:
"Root/Node1/Node2".IsSelected = true
"Root/Node1".IsSelected = false
"Root/Node1/Node2".IsSelected = false
"Root/Node1".IsSelected = true
SelectedItemChanged: "Root/Node1/Node2" => "Root/Node1"   {System.Windows.Controls.TreeView Items.Count:4}
// and it happens again!

我怀疑这与TreeView按需创建的子控件已存在有关,但不理解为何会导致此问题。


复现步骤

  • 在顶部TextBox输入Root/Node0/Node1/Node2并按Tab,指定节点会被选中;
  • 将文本改为Root/Node0并按Tab,选中项会立即回退;
  • 将文本改为Root/Node1/Node1/Node2并按Tab,指定节点会被选中;
  • 将文本改为Root/Node1/Node1/Node3并按Tab,选中项会立即回退。

内容的提问来源于stack exchange,提问作者radj307

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:07:03