Sie können die akzeptierte Antwort weiter vereinfachen. Anstatt die Enums als Strings in Xaml abzutippen und mehr Arbeit in Ihrem Konverter zu machen als nötig, können Sie explizit den Enum-Wert anstelle einer String-Darstellung übergeben, und wie CrimsonX kommentierte, werden Fehler zur Kompilierzeit und nicht zur Laufzeit ausgelöst:
ConverterParameter={x:Static local: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>
Vereinfachen Sie dann den Konverter:
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;
}
}
Bearbeiten (16. Dezember '10):
Dank an anon für Vorschlag: Binding.DoNothing anstelle von DependencyProperty.UnsetValue zurückgeben.
Hinweis - Mehrere Gruppen von RadioButtons im gleichen Container (17. Februar '11):
In xaml, wenn Optionsschaltflächen teilen sich die gleichen übergeordneten Container, dann wählen Sie eine deaktivieren Sie alle anderen innerhalb dieses Containers (auch wenn sie an eine andere Eigenschaft gebunden sind). Versuchen Sie also, Ihre RadioButtons, die an eine gemeinsame Eigenschaft gebunden sind, in einem eigenen Container wie einem Stapel-Panel zu gruppieren. In Fällen, in denen Ihre verwandten RadioButtons nicht in einem einzigen übergeordneten Container untergebracht werden können, setzen Sie die GroupName-Eigenschaft der einzelnen RadioButtons auf einen gemeinsamen Wert, um sie logisch zu gruppieren.
Bearbeiten (5. April '11):
Das if-else von ConvertBack wurde vereinfacht, um einen ternären Operator zu verwenden.
Hinweis - Enum-Typ in einer Klasse verschachtelt (Apr 28 '11):
Wenn Ihr Enum-Typ in einer Klasse verschachtelt ist (und nicht direkt im Namespace), können Sie möglicherweise die "+"-Syntax verwenden, um auf das Enum in XAML zuzugreifen, wie in einer (nicht markierten) Antwort auf die Frage angegeben:
ConverterParameter={x:Static local: IhreKlasse+ YourNestedEnumType.Enum1}
Aus diesem Grund Microsoft Connect Problem Allerdings wird der Designer in VS2010 nicht mehr geladen und gibt an "Type 'local:YourClass+YourNestedEnumType' was not found."
aber das Projekt wird kompiliert und erfolgreich ausgeführt. Natürlich können Sie dieses Problem vermeiden, wenn Sie Ihren Enum-Typ direkt in den Namespace verschieben können.
Bearbeiten (27. Januar '12):
Bei Verwendung von Enum-Flags würde der Konverter folgendermaßen aussehen:
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;
}
}
Bearbeiten (7. Mai '15):
Im Falle eines Nullable Enum (das **nicht** in der Frage gefragt ist, aber in einigen Fällen benötigt werden kann, z.B. ORM, das null von DB zurückgibt, oder wann immer es Sinn macht, dass in der Programmlogik der Wert nicht bereitgestellt wird), denken Sie daran, eine anfängliche null-Prüfung in der Convert-Methode hinzuzufügen und den entsprechenden bool-Wert zurückzugeben, der typischerweise false ist (wenn Sie keine Optionsschaltfläche ausgewählt haben wollen), wie unten:
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);
}
Hinweis - NullReferenceException (10. Oktober '18):
Das Beispiel wurde aktualisiert, um die Möglichkeit zu beseitigen, dass eine NullReferenceException ausgelöst wird. IsChecked" ist ein nullbarer Typ, so dass die Rückgabe von "Nullable" eine vernünftige Lösung zu sein scheint.
4 Stimmen
Wenn Sie dies tun möchten, ohne einzelne RadioButtons in Ihrer XAML zu spezifizieren, würde ich eine ListBox empfehlen, die an die Enum-Werte gebunden ist, wie diese o diese und die Elementvorlage überschrieben, um RadioButtons zu verwenden, wie diese .