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

.NET MAUI中如何为CollectionView正确设置RadioButtonGroup实现单选?

.NET MAUI CollectionView中RadioButton单选互斥问题解决方法

你遇到的核心问题是:CollectionView的每个ItemTemplate会生成独立的Grid容器,导致RadioButton的组作用范围被局限在单个Item内,无法跨Item实现单选互斥。以下是具体解决步骤:

解决方案

  • 移除CollectionView和单个RadioButton上的RadioButtonGroup.GroupName属性
  • 在CollectionView外层添加RadioButtonGroup控件,将所有RadioButton纳入同一组
  • 通过ViewModel绑定跟踪选中项,确保单选逻辑生效

修改后的XAML代码

<RadioButtonGroup GroupName="Answers">
    <CollectionView ItemsSource="{Binding CurrentAnswers}"
                    ItemsLayout="VerticalGrid"
                    ItemSizingStrategy="MeasureAllItems"
                    VerticalScrollBarVisibility="Always"
                    HeightRequest="400">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid x:DataType="models:Answer"
                      Padding="20">
                    <RadioButton Grid.Row="0"
                                 Grid.Column="0"
                                 Content="{x:Binding Content}"
                                 TextColor="{StaticResource NightBlue}"
                                 IsChecked="{Binding Source={RelativeSource AncestorType={x:Type viewmodels:YourViewModel}}, Path=SelectedAnswer, Converter={StaticResource AnswerToBoolConverter}, ConverterParameter={x:Binding .}}" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</RadioButtonGroup>

配套ViewModel与转换器实现

  1. ViewModel部分(定义选中项属性):
public class YourViewModel : INotifyPropertyChanged
{
    private Answer _selectedAnswer;
    public Answer SelectedAnswer
    {
        get => _selectedAnswer;
        set
        {
            _selectedAnswer = value;
            OnPropertyChanged();
        }
    }

    public ObservableCollection<Answer> CurrentAnswers { get; set; } = new();

    // 实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
  1. 转换器部分(判断当前项是否为选中项):
public class AnswerToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var selectedAnswer = value as Answer;
        var currentAnswer = parameter as Answer;
        return selectedAnswer == currentAnswer;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? parameter : null;
    }
}
  1. 在页面资源中注册转换器:
<ContentPage.Resources>
    <converters:AnswerToBoolConverter x:Key="AnswerToBoolConverter" />
</ContentPage.Resources>

关键说明

  • RadioButtonGroup作为统一的组容器,确保所有子RadioButton处于同一组内
  • 通过绑定IsChecked到ViewModel的SelectedAnswer属性,配合转换器实现单选逻辑,同时保证UI与数据状态同步
  • 移除原代码中重复设置的GroupName,避免组作用范围冲突

内容的提问来源于stack exchange,提问作者user23526969

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:12:49