【问题标题】:How to find out which button is selected?如何找出选择了哪个按钮?
【发布时间】:2015-05-21 18:32:12
【问题描述】:
<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# 访问已在 Code-Behind 中检查的哪一项?

是否绝对有必要在每个 RadioButton 上使用 x:Name= 还是有更好的方法?

代码示例总是受欢迎的

【问题讨论】:

标签: c# wpf xaml


【解决方案1】:

是的!还有一种更好的方法,它叫做binding。在绑定之外,你几乎被卡住了(我可以想象分别处理所有检查的事件,并分配给一个枚举,但这真的更好吗?)

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

public enum OsTypes
{
    Windows7_32,
    Windows7_64
}

然后将每个单选按钮绑定到 VM 上的全局“选定”属性。为此,您需要 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、复杂的 switch 语句或其他任何东西。漂亮,干净,精心设计。 MVVM 与 WPF 一起工作,使用它!

【讨论】:

  • 我需要一个不同的类来管理单选按钮吗?我对 MVVM 很陌生
  • @softwareisfun 我不确定你的意思,但我不这么认为。您需要一个数据上下文(视图模型),这是我唯一没有提供完整代码的部分。如果您对 MVVM 有基本问题,请随时加入 WPF 聊天室chat.stackoverflow.com/rooms/18165/wpf
  • 我只想为每个单选按钮设置一个布尔值并跳过转换器要求,但我可以看到使用 Enum 的好处
  • @Julien 当它是一个真正的单选按钮(一次只选择一个)时,我认为 Enum 模型更方便。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2012-04-17
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多