如何找出哪个按钮被选中?

4
<GroupBox x:Name="groupBox" Header="Operating System" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="74" Width="280">
        <StackPanel>
            <RadioButton GroupName="Os" Content="Windows 7 (64-bit)" IsChecked="True"/>
            <RadioButton GroupName="Os" Content="Windows 7 (32-bit)" />
        </StackPanel>
    </GroupBox>

在我的应用程序中,我有几组单选按钮

如何使用C#在代码后台访问已选中的单选按钮组?

是否绝对需要在每个单选按钮上使用 x:Name= 或者有更好的方法?

总是欢迎提供代码示例


请查看https://dev59.com/5GDVa4cB1Zd3GeqPZg9E。 - H.B.
那个例子是关于 ListBox 的。 - software is fun
不,你没有理解。ListBox只是为了帮助你跟踪选择而已。 - H.B.
1个回答

5

是的!有一种更好的方法,它被称为绑定。如果不使用绑定,你就会感到很困难(我可以想象单独处理所有选中事件,并赋值给一个枚举类型,但那真的更好吗?)

对于单选按钮,通常会使用枚举来表示所有可能的值:

public enum OsTypes
{
    Windows7_32,
    Windows7_64
}

然后将每个单选按钮绑定到您的VM上的全局“selected”属性。您需要使用ValueEqualsConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((bool)value) ? parameter : Binding.DoNothing;
    }

然后您的单选按钮看起来像:

<RadioButton Content="Windows 7 32-bit"
             IsChecked= "{Binding CurrentOs, 
                         Converter={StaticResource ValueEqualsConverter},
                         ConverterParameter={x:Static local:OsTypes.Windows7_32}}"

当然,你的虚拟机中有一个属性:

该属性代表了虚拟机实例中的一个值:

public OsTypes CurrentOs {get; set;}

没有x:Name、复杂的转换语句或其他什么。漂亮、清洁和良好设计的MVVM能够与WPF良好配合,使用它吧!


我需要一个不同的类来管理单选按钮吗?我对MVVM非常陌生。 - software is fun
@softwareisfun 我不确定你的意思,但我认为不是这样。你需要一个数据上下文(视图模型),这是我没有提供完整代码的唯一部分。如果你在MVVM方面有基本问题,请随时加入我在WPF聊天室的讨论 http://chat.stackoverflow.com/rooms/18165/wpf - BradleyDotNET
我会为每个单选按钮设置一个布尔值并跳过转换器的要求,但我可以看出使用枚举很好。 - Julien
@Julien 当它是真正的单选按钮(一次只能选择一个),在我看来,枚举模型更加方便。 - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接