E3.12.1indeterminate parent checkbox设计
父级复选框的部分选中需要第三态
别名: 不确定态 · mixed checkbox · 部分选中
概念解释
当父级复选框概括一组子项,而子项里有的勾了、有的没勾时,父级不能显示成普通的开或关,需要第三种不确定态(indeterminate / mixed)。它的意思是「这一组目前是混合的」,不是「父级自己被选中了一半」。没有第三态,父级只能撒谎:画成全勾会让人以为子项都在,画成空会让人以为子项都没在。部分选中是集合的真实状态,必须有自己的表象。
第三态是摘要,不是又一个可提交的独立值。提交时真正有意义的仍是每个子项的布尔,以及(若模型需要)父级节点自己的布尔。
机制
人把父级方框当成集合的折叠视图。两态布尔无法编码三种集合:空集、全集、真子集。硬塞进两态,就会把真子集映射到空或全,扫描折叠起来的树时,摘要和展开后的事实冲突。冲突一旦被发现,用户不再信任任何一层的勾,会逐项点开核对,摘要控件便失去存在理由。
不确定态让摘要与事实同构:全空 → 未勾,全满 → 已勾,其余 → 混合。展开子项时,父级的混合应能被子项的具体勾选解释,而不是另藏一份父级自己的「半选」数据。树很深时,每一层都用同一套摘要规则,混合可以向上冒泡:孙项混合则子项混合,子项混合则父项混合。
边界
没有子项的扁平列表不需要第三态;给普通项加上横线会让人以为系统坏了。父级若在数据模型里是独立对象(选中文件夹本身,不等于选中里面的文件),混合态只描述「子项是否一致」,不要拿它冒充「选中了父节点」。全部子项被禁用时,父级的混合没有操作意义,应改成禁用加说明。单选组没有混合,因为互斥集合走不到「部分为真」。
怎么落地
- 只要父级在视觉上概括子项,就为「子项不一致」准备混合态,不要把混合画成全勾或全空。
- 让混合向上冒泡,保证折叠时看到的摘要与展开后的子项一致。
- 提交和接口仍以叶节点(及需要时的父节点自身)为准,不要把混合当成可写入的第三种布尔。
- 验证:勾一部分子项,折叠父级。父级既不是空也不是对勾,且展开后能解释这个混合。若父级显示全勾,第三态就缺席了。