ぽにょろん

思いついたこととメモ

WPFでRadioButtonにEnumをBindする

目次

環境

  • C# + WPF
  • .NET Framwork4.5.2

実現したいこと

RadioButtonにViewModelのプロパティ値(Enum)をBindする。

実装の方針

  • 各RadioButtonのIsCheckedにEmun値をバインドさせる。
  • Converterを用意して、Bool値に変換する。

実装

Converter

検索すると色々な方法があるみたいですが、簡単にこんな感じで作ってみました。

    [ValueConversion(typeof(Enum), typeof(bool))]
    public class RadioButtonConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || parameter == null) return false;
            return value.ToString() == parameter.ToString();
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || parameter == null) return Binding.DoNothing;
            if ((bool)value)
            {
                return Enum.Parse(targetType, parameter.ToString());
            }
            return Binding.DoNothing;
        }
    }

Bindingしない時は Binding.DoNothing を使うようです。

Binding.DoNothing フィールド (System.Windows.Data)

VMEnum

VMEnumの定義は適当に。

    public class ViewModel
    {
        public TestEnum TestKind { get; set; } = TestEnum.Test4;
    }
    public enum TestEnum { Test1, Test2, Test3, Test4 }

View

RadioButtonはGroupNameを付けておく。
ConverterParameterを指定する。

<Window x:Class="WpfRadioButtonSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfRadioButtonSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="100">
    <Window.Resources>
        <local:RadioButtonConverter x:Key="EnumConverter" />
    </Window.Resources>
    <StackPanel>
        <RadioButton GroupName="Test" Content="Test1" IsChecked="{Binding TestKind, ConverterParameter=Test1, Converter={StaticResource EnumConverter}}"/>
        <RadioButton GroupName="Test" Content="Test2" IsChecked="{Binding TestKind, ConverterParameter=Test2, Converter={StaticResource EnumConverter}}"/>
        <RadioButton GroupName="Test" Content="Test3" IsChecked="{Binding TestKind, ConverterParameter=Test3, Converter={StaticResource EnumConverter}}"/>
        <RadioButton GroupName="Test" Content="Test4" IsChecked="{Binding TestKind, ConverterParameter=Test4, Converter={StaticResource EnumConverter}}"/>
    </StackPanel>
</Window>

ちょっとばかし嵌ってしまったので、メモ。