在MVVM之后确定WPF中来自groupbox的已检查Radiobutton

我有一个带有一些radiobuttons的groupbox。 我如何知道哪一个被检查? 我正在使用WPF并跟随MVVM。

     ....  

现在,我可以想出的一种方法是将每个RadioButton的IsChecked属性绑定到ViewModel中的某个属性,然后在我的ViewModel中执行if..else类型的逻辑以找出所选的单选按钮。

但还有其他优雅的方式吗?

您可以将Radiobuttons的RadioButton.Command绑定到ViewModel的命令,并发送一个唯一的CommandParameter来识别哪个按钮在commandhandler中调用了该命令。

    

在命令处理程序中检查参数以识别单选按钮。

谢谢

您可以创建一个enum ,其中包含RadioButton对象的值作为名称(粗略地),然后使用EnumToBoolConverterIsChecked属性绑定到此enum类型的属性。

 public enum Options { All, Current, Range } 

然后在您的视图模型或代码后面:

 private Options options = Options.All; // set your default value here public Options Options { get { return options; } set { options = value; NotifyPropertyChanged("Options"); } } 

添加Converter

 [ValueConversion(typeof(Enum), typeof(bool))] public class EnumToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null || parameter == null) return false; string enumValue = value.ToString(); string targetValue = parameter.ToString(); bool outputValue = enumValue.Equals(targetValue, StringComparison.InvariantCultureIgnoreCase); return outputValue; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null || parameter == null) return null; bool useValue = (bool)value; string targetValue = parameter.ToString(); if (useValue) return Enum.Parse(targetType, targetValue); return null; } } 

最后,在UI中添加绑定,设置相应的ConverterParameter

    

现在,您可以通过查看视图模型中的Options变量或后面的代码来判断设置了哪个。 您还可以通过设置Options属性来设置选中的RadioButton

还有另一种MVVM方法可以使用IsChecked属性来解决这个问题

这是XAML

            

你的模型就是这样的

  public class RadioButtonQuestion { public string ChoiceQuestion { get; set; } public string answer { get; set; } public List ListOfAnswerOptions { get; set; } } public class AnswerOption { public string individualRadioButtonText { get; set; } public bool IsChecked { get; set; } } 

ViewModel看起来像这样(选择逻辑)

 RadioButtonQuestion r = new RadioButtonQuestion(); var selectedElement = rbuttonQuestion.answerOptions.FirstOrDefault(c => c.IsChecked); r.answer = selectedElement.individualRadioButtonText; 

因此,如果将视图的datacontext设置为此viewmodel。 你必须能够让它发挥作用。

希望能帮助到你。

如果你在选项按钮(布尔,整数,字符串)上使用Tag属性,就像在他的XAML中一样

       

然后你可以使用以下函数来获取所选值(按钮)

 int priority = SelectedRadioValue(0, rP0, rP1, rP2, rP3); 

哪里

 public T SelectedRadioValue(T defaultValue, params RadioButton[] buttons) { foreach (RadioButton button in buttons) { if (button.IsChecked == true) { if (button.Tag is string && typeof(T) != typeof(string)) { string value = (string) button.Tag; return (T) Convert.ChangeType(value, typeof(T)); } return (T)button.Tag; } } return defaultValue; } 

我遇到了同样的问题,我通过从Radiobutton删除“GroupName”属性来解决。

请从所有单选按钮中删除“GroupName”属性。 并检查