MAUI中RadioButton无法直接用于CollectionView单选,需通过绑定SelectedItem+ViewModel逻辑实现;推荐用SelectedItem绑定配合IsSelected属性模拟单选,避免GroupName复用问题。

在 MAUI 中,RadioButton 本身不支持直接绑定到 CollectionView 的每个项来实现“单选列表”,因为 RadioButton 默认是按 GroupName 分组的控件,而 CollectionView 是动态生成模板的,每个项的 RadioButton 若没统一管理,就无法互斥。但可以通过绑定 + ViewModel 逻辑 + 命令配合,模拟出“单选列表”的效果。
用绑定 + SelectedItem 实现逻辑单选(推荐)
不依赖 RadioButton 的原生分组机制,而是用 CollectionView 的 SelectedItem 绑定 + 模板中显示选中状态,更简洁、可控、符合 MVVM。
- ViewModel 中定义
public ObservableCollection和Items { get; } public ListItem? SelectedItem { get; set; } -
CollectionView设置SelectedItem="{Binding SelectedItem}",并启用SelectionMode="Single" - 数据模板中用
RadioButton或CheckBox(视觉上设为IsChecked="{Binding IsSelected, Mode=TwoWay}"),但关键:它的IsChecked绑定到一个计算属性(如IsSelected => this == ViewModel.SelectedItem),点击时触发命令更新SelectedItem - 为避免模板内逻辑复杂,建议在
ListItem类中加一个bool IsSelected属性,并在SelectedItem改变时同步刷新所有项的IsSelected
用 RadioButton + GroupName + Command 手动控制(需注意坑)
如果坚持用原生 RadioButton,必须确保所有项的 GroupName 相同(例如固定写死为 "ListSelection"),并在点击时手动清除其他项状态。
- 在
CollectionView的DataTemplate中放RadioButton,设置GroupName="ListSelection"(不能绑定,必须静态字符串) - 绑定
Command到CheckedChanged或用TapGestureRecognizer触发命令,传入当前项(CommandParameter="{Binding}") - 命令中:先清空所有项的选中状态(比如遍历
Items设IsSelected = false),再设当前项IsSelected = true,最后更新SelectedItem - ⚠️ 注意:
RadioButton在CollectionView中复用时可能残留状态,务必在ListItem的OnPropertyChanged中确保IsSelected变化能正确刷新 UI
UI 层小技巧:让 RadioButton 看起来像列表项
默认 RadioButton 样式较简陋,可嵌套在 HorizontalStackLayout 或 Grid 中,搭配 Label 和间距优化体验:
- 用
VerticalOptions="Center"对齐文字 - 设置
Margin避免贴边,比如Margin="12,8" - 若想点击整行都响应,把
RadioButton包在Frame或Border内,加GestureRecognizers,再把命令绑定到容器上 - 选中状态可用
VisualStateManager定义不同背景色,提升反馈感
绑定示例片段(XAML)
简化版模板参考:
基本上就这些。核心是别被 RadioButton 的“原生单选”带偏——在动态列表里,用 ViewModel 管理选中状态才是稳定可靠的做法。










