Puoi semplificare ulteriormente la risposta accettata. Invece di scrivere gli enum come stringhe in xaml e fare più lavoro nel convertitore del necessario, puoi esplicitamente passare il valore enum invece di una rappresentazione di stringa e, come ha commentato CrimsonX, gli errori vengono generati al momento della compilazione piuttosto che in fase di esecuzione:
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>
Quindi semplifica il convertitore:
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;
}
}
Modifica (16 dic '10):
Grazie a anon per aver suggerito di restituire Binding.DoNothing piuttosto che DependencyProperty.UnsetValue.
Nota - Più gruppi di pulsanti radio nello stesso contenitore (17 febbraio 11):
In xaml, se i pulsanti di opzione condividono lo stesso contenitore principale, quindi selezionarne uno deselezionerà tutti gli altri all'interno di quel contenitore (anche se sono associati a una proprietà diversa). Quindi cerca di mantenere i tuoi RadioButton associati a una proprietà comune raggruppata nel loro contenitore come un pannello di stack. Nei casi in cui i RadioButton correlati non possono condividere un singolo contenitore principale, impostare la proprietà GroupName di ciascun RadioButton su un valore comune per raggrupparli logicamente.
Modifica (5 aprile 11):
If-else di ConvertBack semplificato per l'utilizzo di un operatore ternario.
Nota: tipo Enum nidificato in una classe (28 aprile 11):
Se il tipo di enum è nidificato in una classe (anziché direttamente nello spazio dei nomi), potresti essere in grado di utilizzare la sintassi '+' per accedere all'enum in XAML come indicato in una risposta (non contrassegnata) alla domanda
Impossibile trovare tipo enum per riferimento statico in WPF :
ConverterParameter = {x: Static local: YourClass + YourNestedEnumType.Enum1}
A causa di questo problema di Microsoft Connect , tuttavia, il progettista in VS2010 non caricherà più la dichiarazione "Type 'local:YourClass+YourNestedEnumType' was not found."
, ma il progetto viene compilato ed eseguito correttamente. Ovviamente, puoi evitare questo problema se sei in grado di spostare direttamente il tuo tipo enum nello spazio dei nomi.
Modifica (27 gennaio 12):
Se si utilizzano flag Enum, il convertitore sarebbe il seguente:
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;
}
}
Modifica (7 maggio 15):
Nel caso di un Enumullabile nullable (che
non è richiesto nella domanda, ma può essere necessario in alcuni casi, ad esempio ORM che restituisce null dal DB o ogni volta che potrebbe avere senso che nella logica del programma il valore non sia fornito), ricordarsi di aggiungere un controllo null iniziale nel metodo di conversione e restituisce il valore bool appropriato, che in genere è falso (se non si desidera selezionare alcun pulsante di opzione), come di seguito:
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);
}
Nota - NullReferenceException (10 ottobre 18):
Aggiornato l'esempio per rimuovere la possibilità di lanciare una NullReferenceException.
IsChecked
è un tipo nullable quindi il ritorno
Nullable<Boolean>
sembra una soluzione ragionevole.