-
WPF 라디오 버튼 enum 바인딩(RadoButton Binding enum)C#/WPF 2017. 1. 24. 10:37
WPF 에서 radio 버튼을 사용할 때, 두가지가 아닌 여러가지를 사용하여 enum 형을 관리할 때 각 버튼마다 이벤트를 추가하고, 관리하기가 너무 길어집니다.'
바인딩을 사용하면 편해지는데요, 방법을 알아보겠습니다.
저는 Effect 라는 enum 을 사용하겠습니다.
123456public enum Effect{None,Shadow,Outline}cs 아래는 Effect 형 변수와 속성입니다.
1234567891011121314public 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 를 상속받아야 합니다.
예)
123using System.ComponentModel;public partial class MainWindow : Window, INotifyPropertyChangedcs 해당 윈도우의 DataContext에 자신 또는 해당 속성이 있는 클래스를 추가해 줍니다.
1DataContext = this;cs 그리고 중요한 Convert 클래스가 필요합니다.
12345678910111213141516171819202122232425262728public class RadioBoolToEffectConverter : IValueConverter{#region IValueConverter Memberspublic 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 파일로 넘어갑니다.
123<Window.Resources><local:RadioBoolToEffectConverter x:Key="radioBoolToEffectConverter"/></Window.Resources>cs 위와 같이 Window에 Resources 를 추가해 줍니다. 클래스 명은 위에서 선언한 Convert 클래스 입니다.
x:Key도 마음대로 설정해 주시면 됩니다.
아래는 RadioButton 입니다.
123<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에 자동으로 표시)
'C# > WPF' 카테고리의 다른 글
WPF MediaPlayer Volume 사용 (0) 2017.03.10 WPF Rolling Animation (슬롯머신 같은 애니메이션) (0) 2017.02.17 WPF 윤곽선 텍스트(Outlined Text) (0) 2017.01.23 WPF 메시지 박스 띄우기(경고창 띄우기) (0) 2017.01.16 WPF 글씨에 그림자 효과 (Shadow Text) (2) 2017.01.13 댓글