ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF 라디오 버튼 enum 바인딩(RadoButton Binding enum)
    C#/WPF 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에 자동으로 표시)




    댓글

GiGong