WPFでRadioButtonにEnumをBindする
目次
環境
実現したいこと
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)
VMとEnum
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>
ちょっとばかし嵌ってしまったので、メモ。