Możesz dodatkowo uprościć przyjętą odpowiedź. Zamiast wpisywać wyliczenia jako ciągi znaków w xaml i wykonywać więcej pracy w konwerterze, niż to konieczne, możesz jawnie przekazać wartość wyliczenia zamiast reprezentacji ciągu, a jak skomentował CrimsonX, błędy są generowane w czasie kompilacji, a nie w czasie wykonywania:
ConverterParameter = {x: Statyczny lokalny: YourEnumType.Enum1}
<StackPanel>
<StackPanel.Resources>
<local:ComparisonConverter x:Key="ComparisonConverter" />
</StackPanel.Resources>
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>
Następnie uprość konwerter:
public class ComparisonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(true) == true ? parameter : Binding.DoNothing;
}
}
Edycja (16 grudnia 10):
Dzięki anon za sugerowanie zwrotu Binding.DoNothing zamiast DependencyProperty.UnsetValue.
Uwaga - Wiele grup przycisków RadioButtons w tym samym kontenerze (17 lutego 11):
W Xaml, jeśli przyciski opcji współużytkują ten sam kontener nadrzędny, wówczas wybranie jednego spowoduje odznaczenie wszystkich pozostałych w tym kontenerze (nawet jeśli są powiązane z inną właściwością). Staraj się więc trzymać RadioButton, które są powiązane ze wspólną właściwością, zgrupowane w osobnym pojemniku, takim jak panel stosu. W przypadkach, gdy powiązane RadioButton nie mogą współużytkować jednego kontenera nadrzędnego, ustaw właściwość GroupName każdego RadioButton na wspólną wartość, aby logicznie pogrupować je.
Edytuj (5 kwietnia 11):
Uproszczone narzędzie ConvertBack, jeśli jeszcze, aby użyć operatora trójskładnikowego.
Uwaga - typ enum zagnieżdżony w klasie (28 kwietnia '11):
Jeśli Twój typ wyliczenia jest zagnieżdżony w klasie (zamiast bezpośrednio w przestrzeni nazw), możesz użyć składni „+”, aby uzyskać dostęp do wyliczenia w XAML, jak podano w (nieoznaczonej) odpowiedzi na pytanie
Nie można znaleźć typ wyliczenia dla odniesienia statycznego w WPF :
ConverterParameter = {x: Statyczny lokalny: YourClass + YourNestedEnumType.Enum1}
Z powodu tego problemu z Microsoft Connect projektant w VS2010 nie będzie już ładował deklaracji "Type 'local:YourClass+YourNestedEnumType' was not found."
, ale projekt się kompiluje i uruchamia pomyślnie. Oczywiście możesz uniknąć tego problemu, jeśli możesz przenieść typ wyliczenia bezpośrednio do przestrzeni nazw.
Edytuj (27 stycznia 12):
Jeśli używasz flag Enum, konwerter wyglądałby następująco:
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((Enum)value).HasFlag((Enum)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
Edycja (7 maja 15):
W przypadku Nullable Enum (które
nie jest zadawane w pytaniu, ale może być potrzebne w niektórych przypadkach, np. ORM zwraca wartość null z DB lub ilekroć może mieć sens, że w logice programu wartość nie jest podana), pamiętaj, aby dodać początkowe sprawdzenie wartości zerowej w metodzie konwersji i zwrócenie odpowiedniej wartości bool, zwykle jest to fałsz (jeśli nie chcesz, aby wybrany został żaden przycisk opcji), jak poniżej:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) {
return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue);
}
return value.Equals(parameter);
}
Uwaga - wyjątek NullReferenceException (10 października 18):
Zaktualizowano przykład, aby usunąć możliwość zgłaszania wyjątku NullReferenceException.
IsChecked
jest typem zerowalnym, więc powrót
Nullable<Boolean>
wydaje się rozsądnym rozwiązaniem.