WPF – Enum an RadioButtons binden

Veröffentlicht von

… Databinding von einem Enum-Property an RadioButtons und umgekehrt natürlich.

Folgende Situation, wir haben ein paar RadioButtons:

Diese wollen wir an folgendes Property im ViewModel binden:

public enum TemplateType { Empty, Contact, Booking, ReservationRestaurant, Appointment }

private TemplateType _selectedTemplateType = TemplateType.Empty;

public TemplateType SelectedTemplateType
{
    get
    {
        return _selectedTemplateType;
    }
    set
    {
        Set(() => SelectedTemplateType, ref _selectedTemplateType, value);
    }
}

Hier haben wir ein Enum und die Eigenschaft. Das Enum soll entsprechend der Auswahl der RadioButtons gesetzt werden und umgekehrt natürlich auch.

Möglich macht dies der folgende IValueConverter:

public class EnumBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter.ToString();
        if (parameterString == null)
            return DependencyProperty.UnsetValue;

        if (Enum.IsDefined(value.GetType(), value) == false)
            return DependencyProperty.UnsetValue;

        object parameterValue = Enum.Parse(value.GetType(), parameterString);

        return parameterValue.Equals(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter.ToString();
        if (parameterString == null)
            return DependencyProperty.UnsetValue;

        return Enum.Parse(targetType, parameterString);
    }
}

Quelle: https://stackoverflow.com/questions/397556/how-to-bind-radiobuttons-to-an-enum

Der Konverter ist universell einsetzbar. Er stamm mit geringen Modifikationen von StackOverflow.com, dort gerne auch noch vorbeischauen.

Nun müssen wir noch das DataBinding im Xaml-Code einfügen:

<RadioButton x:Name="RadioEmptyForm"
  IsChecked="{Binding SelectedTemplateType, Converter={StaticResource EnumBooleanConverter}, 
  ConverterParameter={x:Static vm:FormCreationWizardModel+TemplateType.Empty}}"
  GroupName="TemplateType"
  Content="Create empty form"></RadioButton>

Spannend ist der Teil des Parameters:

{x:Static vm:FormCreationWizardModel+TemplateType.Empty}

Hier geben wir den Wert aus unserem Enum an. Das Enum ist in der Klasse „FormCreationWizardModel“ definiert, daher die etwas krude Syntax mit dem +. Der zweite RadioButton sieht nun so aus:

<RadioButton x:Name="RadioContactForm"
     IsChecked="{Binding SelectedTemplateType, Converter={StaticResource EnumBooleanConverter}, 
     ConverterParameter={x:Static vm:FormCreationWizardModel+TemplateType.Contact}}"
     Content="Contact form"
     GroupName="TemplateType"
     Margin="0,10,0,0"></RadioButton>

Und so weiter…

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert