WPF - 允许在radiobutton组中进行多项选择的Bug

时间:2014-01-14 20:15:32

标签: wpf mvvm radio-button

我在itemscontrols中有多个比率按钮,并且数据模板绑定到MVVM / prism应用程序中的数据库数据。每组单选按钮都相应地按名称分组,以便它们是单独的组。

我遇到的问题(违反了单选按钮的惯例)是你可以在组中选择多个选项。并非所有选项都允许多项选择。有些人表现得像别人没有的那样。在通过窥探检查时,所有单选按钮都属于同一组,但有多个按钮报告为IsChecked。

有什么想法吗?

由于

编辑 - 代码

XAML

   <StackPanel Grid.Column="0" Margin="10,0,0,10">
                                        <TextBlock Margin="5,5,0,5"
                                                   FontSize="16"
                                                   FontWeight="Bold"
                                                   Foreground="{Binding      Path=ThemeBackground}"
                                                   Text="From" />
                                        <ItemsControl ItemsSource="{Binding Path=InternetItems}">
                                            <ItemsControl.ItemTemplate>
                                                <DataTemplate>
                                                    <RadioButton Margin="5"
                                                                 Content="{Binding Path=Title}"
                                                                 GroupName="InternetFrom"
                                                                 IsChecked="{Binding Path=IsSelected}"
                                                                 IsEnabled="{Binding Path=IsEnabled}" />
                                                </DataTemplate>
                                            </ItemsControl.ItemTemplate>
                                        </ItemsControl>
                                    </StackPanel>

查看模型

public ObservableCollection<Item> InternetItems
    {
        get
        {
            return
                new ObservableCollection<Item>(
                    _items.Where(x => x.Category == Category.InternetFrom).OrderBy(x => x.DisplayOrder));
        }

    }

编辑 -

问题已解决。后面的代码是每次选择单选按钮时启动一个新的可观察集合,导致多个datacontexts,无论单选按钮的组名是否相同

2 个答案:

答案 0 :(得分:3)

如果

RadioButton控件共享相同的容器(例如,来自PanelContentControl的任何内容),则它们是相互排斥的。在您的情况下,ItemsControl中生成的每个项目都是一个单独的容器,因此按钮不会自动互斥。

例如: 如果你的ItemsControl设置如下,按钮是互斥的:

<ItemsControl>
    <RadioButton Content="1" />
    <RadioButton Content="2" />
    <RadioButton Content="3" />
    <RadioButton Content="4" />
</ItemsControl>

但这不是:

<ItemsControl>
    <Grid>
        <RadioButton Content="1" />
    </Grid>
    <Grid>
        <RadioButton Content="2" />
    </Grid>
    <Grid>
        <RadioButton Content="3" />
    </Grid>
    <Grid>
        <RadioButton Content="4" />
    </Grid>
</ItemsControl>

正如迪恩所说,分配相同的GroupName财产将解决您的问题。

<ItemsControl>
    <Grid>
        <RadioButton Content="1"
                        GroupName="Group1" />
    </Grid>
    <Grid>
        <RadioButton Content="2"
                        GroupName="Group1" />
    </Grid>
    <Grid>
        <RadioButton Content="3"
                        GroupName="Group1" />
    </Grid>
    <Grid>
        <RadioButton Content="4"
                        GroupName="Group1" />
    </Grid>
</ItemsControl>

修改

如果您有多个ItemsControl,则可以在每个GroupName中为RadioButton设置不同的ItemsControl。在这种情况下,范围内的默认样式会派上用场:

<StackPanel>
    <ItemsControl>
        <ItemsControl.Resources>
            <Style TargetType="{x:Type RadioButton}">
                <Setter Property="GroupName"
                        Value="Group1" />
            </Style>
        </ItemsControl.Resources>
        <Grid>
            <RadioButton Content="1" />
        </Grid>
        <Grid>
            <RadioButton Content="2" />
        </Grid>
        <Grid>
            <RadioButton Content="3" />
        </Grid>
        <Grid>
            <RadioButton Content="4" />
        </Grid>
    </ItemsControl>
    <ItemsControl>
        <ItemsControl.Resources>
            <Style TargetType="{x:Type RadioButton}">
                <Setter Property="GroupName"
                        Value="Group2" />
            </Style>
        </ItemsControl.Resources>
        <Grid>
            <RadioButton Content="1" />
        </Grid>
        <Grid>
            <RadioButton Content="2" />
        </Grid>
        <Grid>
            <RadioButton Content="3" />
        </Grid>
        <Grid>
            <RadioButton Content="4" />
        </Grid>
    </ItemsControl>
</StackPanel>

答案 1 :(得分:2)

你做错了,同一组内的RadioButton是互斥的。如果您使用GroupName属性将两个或多个RadioButton分配给某个群组,则您只能从该群组中选择一个RadioButton

RadioButton.GroupName Property

  

获取或设置指定哪些RadioButton控件的名称   相互排斥。

     

用户可以在每个组中选择一个RadioButton。

你真的认为你在.NET Framework中发现了这样一个根本没有人报告但又没有修复的错误吗?