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

Bhr*_*mar 15 c# wpf groupbox mvvm radio-button

我有一个带有一些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>
Run Code Online (Sandbox Code Playgroud)

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

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

Nit*_*tin 30

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

<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio1"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio2"/>
<RadioButton Command="{Binding MyCommand}" CommandParameter="Radio3"/>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

  • 伙计,该解决方案工作正常,但是我将如何将默认选中设置为我的任何 RadioButton。好吧,我们可以在 contructor 中设置它,但这会违反 MVVM 规则。任何想法都会有所帮助。 (2认同)

She*_*dan 18

您可以创建一个enum包含的值RadioButton对象作为名称(大致),然后绑定IsChecked属性的这种类型的属性enum使用EnumToBoolConverter.

public enum Options
{
    All, Current, Range
}
Run Code Online (Sandbox Code Playgroud)

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

private Options options = Options.All; // set your default value here

public Options Options
{ 
    get { return options; }
    set { options = value; NotifyPropertyChanged("Options"); }
}
Run Code Online (Sandbox Code Playgroud)

添加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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在UI中添加绑定,设置适当的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}" />
Run Code Online (Sandbox Code Playgroud)

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