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
相关产品推荐
相关产品推荐

