… 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…