受け入れられた回答をさらに単純化できます。列挙型を xaml の文字列として入力し、コンバーターで必要以上の作業を行う代わりに、文字列表現の代わりに列挙値を明示的に渡すことができます。CrimsonX がコメントしたように、実行時ではなくコンパイル時にエラーがスローされます。
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>
次に、コンバーターを単純化します。
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;
}
}
編集(10年12月16日):
DependencyProperty.UnsetValue ではなく Binding.DoNothing を返すことを提案してくれた anon に感謝します。
注 - 同じコンテナー内の RadioButtons の複数のグループ (2011 年 2 月 17 日):
xaml では、ラジオ ボタンが同じ親コンテナーを共有している場合、1 つを選択すると、そのコンテナー内の他のすべての選択が解除されます (別のプロパティにバインドされている場合でも)。そのため、共通のプロパティにバインドされている RadioButton を、スタック パネルのような独自のコンテナーにまとめてグループ化するようにしてください。関連する RadioButton が 1 つの親コンテナーを共有できない場合は、各 RadioButton の GroupName プロパティを共通の値に設定して、それらを論理的にグループ化します。
編集(11年4月5日):
三項演算子を使用するために ConvertBack の if-else を簡素化しました。
注 - クラスにネストされた列挙型 (2011 年 4 月 28 日):
列挙型が (名前空間に直接ではなく) クラスにネストされている場合、質問に対する (マークされていない) 回答に記載されているように、「+」構文を使用して XAML の列挙型にアクセスできる場合があります。
ConverterParameter={x:Static local: YourClass+ YourNestedEnumType.Enum1}
ただし、このMicrosoft Connect の問題により、VS2010 のデザイナーは状態をロードしなくなります"Type 'local:YourClass+YourNestedEnumType' was not found."が、プロジェクトは正常にコンパイルおよび実行されます。もちろん、列挙型を名前空間に直接移動できる場合は、この問題を回避できます。
編集(12年1月27日):
Enum フラグを使用する場合、コンバーターは次のようになります。
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;
}
}
編集(15年5月7日):
Nullable Enum の場合 (これは質問では **尋ねられませんが、場合によっては必要になる場合があります。たとえば、ORM が DB から null を返す場合や、プログラム ロジックで値が提供されていないことが理にかなっている場合など)。 Convert メソッドに最初の null チェックを追加し、適切な bool 値を返すことを忘れないでください。これは、通常は false です (ラジオ ボタンを選択したくない場合)。
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);
}
注 - NullReferenceException (18 年 10 月 10 日):
NullReferenceException をスローする可能性を排除するために例を更新しました。`IsChecked` は null 許容型なので、 `Nullable` を返すことは合理的な解決策のようです。