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