C#/WPF

WPF 라디오 버튼 enum 바인딩(RadoButton Binding enum)

기공이 2017. 1. 24. 10:37

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(thisnew PropertyChangedEventArgs("Effects"));
    }
}
cs


바인딩을 해주어도 해당 속성이 바뀌었다는 이벤트를 발생시키지는 않습니다. 그래서 우리가 직접 이벤트를 연결해 주어야 하기 때문에 PropertyChangedEventHandler 를 선언한 뒤, 사용했습니다.


PropertyChanged에 전달하는 PropertyChangedEventArgs는 해당 속성의 이름을 전달해야 하는데, 이 내용이 바인딩에서 Path에 연결됩니다.


그리고 이 PropertyChangedEvent를 사용하기 위해서는 해당 클래스에 INotifyPropertyChanged 를 상속받아야 합니다.


예)

1
2
3
using System.ComponentModel;
 
public partial class MainWindow : WindowINotifyPropertyChanged
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에 자동으로 표시)