app wpf binding radio-button radio-group

app - vinculación de grupo de botones de radio a una propiedad en WPF



wpf app xaml (3)

Declara una enumeración similar a:

enum RadioOptions {Option1, Option2}

XAML:

<RadioButton IsChecked="{Binding SelectedOption, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static local:RadioOptions.Option1}}"/> <RadioButton IsChecked="{Binding SelectedOption, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static local:RadioOptions.Option2}}"/>

Clase de convertidor:

public class EnumBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value.Equals(parameter); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return ((bool)value) ? parameter : Binding.DoNothing; } }

Imaginemos que tengo:

<RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton1IsChecked}" /> <RadioButton GroupName="Group1" IsChecked="{Binding Path=RadioButton2IsChecked}" />

Y luego en mi clase de fuente de datos tengo:

public bool RadioButton1IsChecked { get; set; } public bool RadioButton2IsChecked { get; set; } public enum RadioButtons { RadioButton1, RadioButton2, None } public RadioButtons SelectedRadioButton { get { if (this.RadioButtonIsChecked) return RadioButtons.RadioButton1; else if (this.RadioButtonIsChecked) return RadioButtons.RadioButton2; else return RadioButtons.None; } }

¿Puedo vincular de alguna manera mis botones de radio directamente a la propiedad SelectedRadioButton ? Realmente necesito las propiedades RadioButton1IsChecked y RadioButton2IsChecked solo para calcular el radiobutton seleccionado.


XAML:

<RadioButton IsChecked="{Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged}">Option1</RadioButton> <RadioButton IsChecked="{Binding Path=SelectedOption, UpdateSourceTrigger=PropertyChanged, Converter={v:NotBoolenConverter}}">Option2</RadioButton>

Convertidor:

public class NotBoolenConverter : IValueConverter { public NotBoolenConverter() { } public override object Convert( object value, Type targetType, object parameter, CultureInfo culture) { bool output = (bool)value; return !output; } public override object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture) { bool output = (bool)value; return !output; } }

Funciona con 2 botones de radio, vinculando uno a lo contrario del otro.


<RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton1}" /> <RadioButton GroupName="Group1" IsChecked="{Binding Path=SelectedRadioButton, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButton2}" />

public enum RadioButtons { RadioButton1, RadioButton2, None } public RadioButtons SelectedRadioButton {get;set;} public class EnumBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var ParameterString = parameter as string; if (ParameterString == null) return DependencyProperty.UnsetValue; if (Enum.IsDefined(value.GetType(), value) == false) return DependencyProperty.UnsetValue; object paramvalue = Enum.Parse(value.GetType(), ParameterString); return paramvalue.Equals(value); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var ParameterString = parameter as string; var valueAsBool = (bool) value; if (ParameterString == null || !valueAsBool) { try { return Enum.Parse(targetType, "0"); } catch (Exception) { return DependencyProperty.UnsetValue; } } return Enum.Parse(targetType, ParameterString); } }