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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:45:48