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

时间:2013-09-04 14:35:27

标签: c# wpf mvvm radio-button groupbox

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

<GroupBox Name="grpbx_pagerange" Header="Print Range">
    <Grid >
        <RadioButton Name="radbtn_all" Content="All Pages" GroupName="radios_page_range" IsChecked="True"  />
        <RadioButton x:Name="radbtn_curr" Content="Current Page" GroupName="radios_page_range"  />
        <RadioButton Name="radbtn_pages" Content="Page Range" GroupName="radios_page_range" />

        ....

</GroupBox>

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

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

5 个答案:

答案 0 :(得分:29)

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

<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>

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

由于

答案 1 :(得分:18)

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

EnumToBoolConverter

然后在你的视图模型或代码背后:

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

然后,最后,在UI中添加绑定,设置相应的[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; } }

ConverterParameter

现在,您可以通过查看视图模型中的<RadioButton Content="All Pages" IsChecked="{Binding Options, Converter={ StaticResource EnumToBoolConverter}, ConverterParameter=All}" /> <RadioButton Content="Current Page" IsChecked="{Binding Options, Converter={ StaticResource EnumToBoolConverter}, ConverterParameter=Current}" /> <RadioButton Content="Page Range" IsChecked="{Binding Options, Converter={ StaticResource EnumToBoolConverter}, ConverterParameter=Range}" /> 变量或后面的代码来判断设置了哪个。您还可以通过设置Options属性来设置选中的RadioButton

答案 2 :(得分:1)

使用IsChecked Property

还有另一种MVVM方法可以解决这个问题

这是XAML

<Page>
<Page.Resources>
<DataTemplate x:Key="ChoiceItemTemplate">
<RadioButton Content="{Binding individualRadioButtonText}"
     IsTabStop="True"
     GroupName="choice"
     IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
 </DataTemplate>
</Page.Resources>


 <StackPanel>
  <TextBlock Text="{Binding ChoiceQuestion}" />
 <ItemsControl  ItemsSource="{Binding ListOfAnswerOptions}"
                ItemTemplate="{StaticResource ChoiceItemTemplate}" />
 </StackPanel>
</Page>

您的模型将是这样的

 public class RadioButtonQuestion
 {
    public string ChoiceQuestion { get; set; }
    public string answer { get; set; }
    public List<AnswerOption> 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。你必须能够让它发挥作用。

希望它有所帮助。

答案 3 :(得分:1)

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

中一样
<StackPanel Orientation="Horizontal" Margin="10,10, 0, 0">
    <RadioButton Name="rP0" Content="Low  " Tag="0" />
    <RadioButton Name="rP1" Content="Normal" Tag="1" IsChecked="True" />
    <RadioButton Name="rP2" Content="Medium" Tag="2" />
    <RadioButton Name="rP3" Content="High" Tag="3" />
</StackPanel>

然后您可以使用以下功能获取所选值(按钮)

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

,其中

public T SelectedRadioValue<T>(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;
}

答案 4 :(得分:-4)

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

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