포스트

WPF 에서 RadioButton 을 Enum 값으로 깔끔하게 바인딩하기 (MVVM 방식)

WPF 에서 RadioButton 을 Enum 값으로 깔끔하게 바인딩하기 (MVVM 방식)

WPF에서 RadioButton 여러 개를 만들고, 선택된 항목을 ViewModel 에서 관리하고 싶을 때, 보통 bool 바인딩을 각각 하게 됩니다. 하지만 이보다는 Enum을 사용해서 하나의 속성으로 관리하는 것이 훨씬 깔끔하고 유지보수에도 유리합니다.

이 글에서는 EnumIValueConverter를 이용해 RadioButton 여러 개를 하나의 Enum 속성으로 바인딩하는 방법을 소개합니다.

목표

  • RadioButton 여러 개를 enum 값으로 연결
  • 선택된 항목을 ViewModel 의 하나의 SelectedOption 속성으로 바인딩

1. Enum 정의

1
2
3
4
5
6
public enum Mode
{
    Easy,
    Normal,
    Hard
}

2. ViewModel 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainViewModel : ObservableObject
{
    private Mode _selectedMode;
    public Mode SelectedMode
    {
        get => _selectedMode;
        set => SetProperty(ref _selectedMode, value);
    }

    public MainViewModel()
    {
        SelectedMode = Mode.Normal;
    }
}

ObservableObject 는 MVVM Toolkit의 클래스 입니다. INotifyPropertyChanged 구현 포함.

3. Enum → bool 컨버터 만들기

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
29
30
31
32
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;

public class EnumEqualsConverter : MarkupExtension, IValueConverter
{
    public object EnumValue { get; set; } = default!;

    public EnumEqualsConverter() { }

    public EnumEqualsConverter(object enumValue)
    {
        EnumValue = enumValue;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Equals(value, EnumValue);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value as bool?) == true ? EnumValue : Binding.DoNothing;
    }
}

EnumValueobject로 선언되어 있어 어떤 enum 타입이든 재사용 가능합니다.

4. XAML에서 RadioButton 바인딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window ...
        xmlns:local="clr-namespace:YourAppNamespace"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel>
    <RadioButton Content="쉬움"
                 IsChecked="{Binding SelectedMode, Converter={local:EnumEqualsConverter EnumValue={x:Static local:Mode.Easy}}}" />

    <RadioButton Content="보통"
                 IsChecked="{Binding SelectedMode, Converter={local:EnumEqualsConverter EnumValue={x:Static local:Mode.Normal}}}" />

    <RadioButton Content="어려움"
                 IsChecked="{Binding SelectedMode, Converter={local:EnumEqualsConverter EnumValue={x:Static local:Mode.Hard}}}" />
</StackPanel>

장점 요약

항목설명
타입 안정성EnumValue에 실제enum 값을 넘기므로 오타 위험 없음
코드 재사용성어떤 enum 타입이든 범용적으로 사용 가능
XAML 간결성ConveterParameter 없이 바로 enum 값 사용
MVVM 친화적ViewModel과 뷰가 깔끔하게 분리됨

마무리

이 방식은 라디오 버튼 그룹을 enum 값으로 관리할 때 가장 깔끔하고 안전한 방법 중 하나입니다.
특히 여러 enum을 사용하는 프로젝트에서 하나의 EnumEqualsConverter모든 라디오 바인딩을 통일할 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.