Sie können die akzeptierte Antwort weiter vereinfachen. Anstatt die Aufzählungen in xaml als Zeichenfolgen einzugeben und mehr Arbeit in Ihrem Konverter als nötig zu erledigen, können Sie den Aufzählungswert anstelle einer Zeichenfolgendarstellung explizit übergeben. Wie CrimsonX kommentierte, werden Fehler eher zur Kompilierungszeit als zur Laufzeit ausgegeben:
ConverterParameter = {x: Statisch lokal: 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>
Dann vereinfachen Sie 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):
Vielen Dank an anon für den Vorschlag, Binding.DoNothing anstelle von DependencyProperty.UnsetValue zurückzugeben.
Hinweis - Mehrere Gruppen von RadioButtons in demselben Container (17. Februar 11):
Wenn in xaml Optionsfelder denselben übergeordneten Container verwenden, werden durch Auswahl eines Optionsfelds alle anderen in diesem Container deaktiviert (auch wenn sie an eine andere Eigenschaft gebunden sind). Versuchen Sie also, Ihre RadioButton-Dateien, die an eine gemeinsame Eigenschaft gebunden sind, wie ein Stapelfenster in einem eigenen Container zusammenzufassen. In Fällen, in denen Ihre zugehörigen RadioButtons keinen einzelnen übergeordneten Container gemeinsam nutzen können, setzen Sie die GroupName-Eigenschaft jedes RadioButton auf einen gemeinsamen Wert, um sie logisch zu gruppieren.
Bearbeiten (5. April 11):
Vereinfachtes ConvertBack-If-else zur Verwendung eines ternären Operators.
Hinweis - Aufzählungstyp in einer Klasse verschachtelt (28. April 11):
Wenn Ihr Aufzählungstyp in einer Klasse verschachtelt ist (und nicht direkt im Namespace), können Sie möglicherweise die Syntax '+' verwenden, um auf die Aufzählung in XAML zuzugreifen, wie in einer (nicht markierten) Antwort auf die Frage
Nicht gefunden angegeben Aufzählungstyp für statische Referenz in WPF :
ConverterParameter = {x: Statisch lokal: YourClass + YourNestedEnumType.Enum1}
Aufgrund dieses Microsoft Connect- Problems lädt der Designer in VS2010 jedoch keine Angabe mehr "Type 'local:YourClass+YourNestedEnumType' was not found."
, sondern das Projekt wird erfolgreich kompiliert und ausgeführt. Natürlich können Sie dieses Problem vermeiden, wenn Sie Ihren Aufzählungstyp direkt in den Namespace verschieben können.
Bearbeiten (27. Januar 12):
Wenn Enum-Flags verwendet werden, lautet der Konverter wie folgt:
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):
Denken Sie im Fall einer nullfähigen Aufzählung (die in der Frage
nicht gestellt wird, aber in einigen Fällen erforderlich sein kann, z. B. ORM, das null aus der Datenbank zurückgibt, oder wann immer es sinnvoll ist, dass der Wert in der Programmlogik nicht angegeben wird), daran, ihn hinzuzufügen eine anfängliche Nullprüfung in der Konvertierungsmethode und Rückgabe des entsprechenden Bool-Werts, der normalerweise falsch ist (wenn Sie kein Optionsfeld auswählen möchten), 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 des Auslösens einer NullReferenceException zu entfernen.
IsChecked
ist ein nullbarer Typ, daher
Nullable<Boolean>
scheint die Rückgabe eine vernünftige Lösung zu sein.