Você pode simplificar ainda mais a resposta aceita. Em vez de digitar as enumerações como seqüências de caracteres no xaml e fazer mais trabalho no conversor do que o necessário, você pode transmitir explicitamente o valor da enumeração, em vez de uma representação de sequência, e, como comentou o CrimsonX, os erros são gerados no momento da compilação, em vez do tempo de execução:
ConverterParameter = {x: local estático: 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>
Em seguida, simplifique o conversor:
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;
}
}
Editar (16 de dez '10):
Agradecemos a anon por sugerir o retorno de Binding.DoNothing em vez de DependencyProperty.UnsetValue.
Nota - Vários grupos de RadioButtons no mesmo contêiner (17 de fevereiro de 11):
No xaml, se os botões de opção compartilharem o mesmo contêiner pai, a seleção de um desmarcará todos os outros contidos nesse contêiner (mesmo que estejam vinculados a uma propriedade diferente). Portanto, tente manter o seu RadioButton vinculado a uma propriedade comum agrupada em seu próprio contêiner como um painel de pilha. Nos casos em que seus RadioButtons relacionados não possam compartilhar um único contêiner pai, defina a propriedade GroupName de cada RadioButton como um valor comum para agrupá-los logicamente.
Editar (5 de abril de 11):
Caso contrário do ConvertBack simplificado para usar um Operador Ternário.
Nota - Tipo de enum aninhado em uma classe (28 de abril de 11):
Se o seu tipo de enumeração estiver aninhado em uma classe (em vez de diretamente no espaço de nomes), você poderá usar a sintaxe '+' para acessar a enumeração no XAML, conforme indicado em uma resposta (não marcada) à pergunta
Não é possível encontrar tipo de enum para referência estática no WPF :
ConverterParameter = {x: local estático: YourClass + YourNestedEnumType.Enum1}
Devido a este problema do Microsoft Connect , no entanto, o designer no VS2010 não carregará mais a declaração "Type 'local:YourClass+YourNestedEnumType' was not found."
, mas o projeto é compilado e executado com êxito. Obviamente, você pode evitar esse problema se conseguir mover seu tipo de enum diretamente para o espaço para nome.
Editar (27 de janeiro de 12):
Se estiver usando sinalizadores Enum, o conversor seria o seguinte:
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;
}
}
Editar (7 de maio de 15):
No caso de um Enum Nullable (que
não é perguntado na pergunta, mas pode ser necessário em alguns casos, por exemplo, ORM retornando nulo do DB ou sempre que possa fazer sentido que na lógica do programa o valor não seja fornecido), lembre-se de adicionar uma verificação nula inicial no método Convert e retorne o valor bool apropriado, que normalmente é falso (se você não deseja selecionar nenhum botão de opção), como abaixo:
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 de outubro de 18):
Atualizado o exemplo para remover a possibilidade de lançar uma NullReferenceException.
IsChecked
é um tipo anulável, portanto, retornar
Nullable<Boolean>
parece uma solução razoável.