WinUI TreeView多选模式下如何反向设置选中的年份节点
问题根因
当前写法无法实现多选效果,核心是两个错误:
TreeView的SelectedNode属性仅对应单选模式下的单个选中节点,SelectionMode="Multiple"时多选的选中项集合由SelectedNodes属性管理,且该属性是只读的,无法直接通过绑定赋值- 你绑定的目标是字符串类型的
year字段,和SelectedNode要求的TreeViewNode类型不匹配,绑定本身不会正常工作
正确实现方案
第一步:修正现有选中值读取逻辑
你之前读取选中年份的代码存在问题,SelectedNodes集合存储的是TreeViewNode实例,直接调用ToString()会返回对象类型名而非节点实际内容,需要读取节点的Content属性:
List<string> selectedYears = new List<string>(); foreach (TreeViewNode node in tbYear.SelectedNodes) { selectedYears.Add(node.Content.ToString()); } // 如果需要拼接成字符串再自行拼接即可,优先用集合存储方便后续反向匹配
第二步:实现反向选中逻辑
多选场景下不需要绑定SelectedNode,直接遍历节点匹配值、设置节点的IsSelected属性即可:
/// <summary> /// 根据传入的年份值设置TreeView选中状态 /// </summary> /// <param name="yearData">接收到的年份数据,若为拼接字符串可先拆分为年份值集合</param> private void SelectYearNodes(List<string> yearData) { // 清空历史选中状态 tbYear.UnselectAll(); // 你的TreeView结构中第一个根节点是"Year"分组,所有年份节点都在它的Children集合下 TreeViewNode yearRoot = tbYear.RootNodes[0]; foreach (TreeViewNode node in yearRoot.Children) { string nodeValue = node.Content.ToString(); if (yearData.Contains(nodeValue)) { node.IsSelected = true; } } }
如果接收到的是拼接后的年份字符串(比如"1º3º10º12º"),先按规则拆分出单个年份值生成集合,再调用上述方法即可,拆分时注意区分1-9的单数字年份和10-12的双数字年份,避免拆错。
注意:不要在页面构造函数中直接调用选中方法,此时TreeView节点还未完成初始化,会出现空引用错误,初始化选中逻辑请放到控件
Loaded事件触发后执行。
如果需要走MVVM模式的绑定写法,可以自定义TreeView的ItemTemplate,将节点的IsSelected属性双向绑定到ViewModel中对应年份项的选中状态属性,对于你当前静态写死节点的场景,直接用上述遍历方法实现最简单,也不会出现绑定类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Marco Oliveira
相关产品推荐
相关产品推荐

