WPF 라디오 버튼 enum 바인딩(RadoButton Binding enum)
WPF 에서 radio 버튼을 사용할 때, 두가지가 아닌 여러가지를 사용하여 enum 형을 관리할 때 각 버튼마다 이벤트를 추가하고, 관리하기가 너무 길어집니다.'
바인딩을 사용하면 편해지는데요, 방법을 알아보겠습니다.
저는 Effect 라는 enum 을 사용하겠습니다.
1 2 3 4 5 6 | public enum Effect { None, Shadow, Outline } | cs |
아래는 Effect 형 변수와 속성입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public event PropertyChangedEventHandler PropertyChanged; Effect _effects; public Effect Effects { get { return _effects; } set { _effects = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Effects")); } } | cs |
바인딩을 해주어도 해당 속성이 바뀌었다는 이벤트를 발생시키지는 않습니다. 그래서 우리가 직접 이벤트를 연결해 주어야 하기 때문에 PropertyChangedEventHandler 를 선언한 뒤, 사용했습니다.
PropertyChanged에 전달하는 PropertyChangedEventArgs는 해당 속성의 이름을 전달해야 하는데, 이 내용이 바인딩에서 Path에 연결됩니다.
그리고 이 PropertyChangedEvent를 사용하기 위해서는 해당 클래스에 INotifyPropertyChanged 를 상속받아야 합니다.
예)
1 2 3 | using System.ComponentModel; public partial class MainWindow : Window, INotifyPropertyChanged | cs |
해당 윈도우의 DataContext에 자신 또는 해당 속성이 있는 클래스를 추가해 줍니다.
1 | DataContext = this; | cs |
그리고 중요한 Convert 클래스가 필요합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class RadioBoolToEffectConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string parameterString = parameter as string; if (parameterString == null) return DependencyProperty.UnsetValue; if (Enum.IsDefined(value.GetType(), value) == false) return DependencyProperty.UnsetValue; object parameterValue = Enum.Parse(value.GetType(), parameterString); return parameterValue.Equals(value); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string parameterString = parameter as string; if (parameterString == null) return DependencyProperty.UnsetValue; return Enum.Parse(targetType, parameterString); } #endregion } | cs |
클래스의 이름은 상관 없습니다.
그 뒤 xaml 파일로 넘어갑니다.
1 2 3 | <Window.Resources> <local:RadioBoolToEffectConverter x:Key="radioBoolToEffectConverter"/> </Window.Resources> | cs |
위와 같이 Window에 Resources 를 추가해 줍니다. 클래스 명은 위에서 선언한 Convert 클래스 입니다.
x:Key도 마음대로 설정해 주시면 됩니다.
아래는 RadioButton 입니다.
1 2 3 | <RadioButton x:Name="radioButton" Content="none" GroupName="First" IsChecked="{Binding Path=Effects, Converter={StaticResource radioBoolToEffectConverter}, ConverterParameter=None}"/> <RadioButton x:Name="radioButton1" Content="shadow" GroupName="First" IsChecked="{Binding Path=Effects, Converter={StaticResource radioBoolToEffectConverter}, ConverterParameter=Shadow}"/> <RadioButton x:Name="radioButton2" Content="outline" GroupName="First" IsChecked="{Binding Path=Effects, Converter={StaticResource radioBoolToEffectConverter}, ConverterParameter=Outline}"/> | cs |
Path를 해당 속성으로 설정하고, Converter는 위에서 설정한 x:Key, Parameter는 해당 버튼이 전달할 내용을 넣어주시면 됩니다.
예제 영상
(버튼을 누르면 TextBox에 자동으로 표시)