[WPF] 변환기 – IValueConverter

[WPF] 변환기 – IValueConverter

이번 글에서는 간단하게 변환기 IValueConverter에 대해 알아보겠습니다. 데이터 바인딩을 사용하면 객체 유형을 변환하는 작업을 수행하게 됩니다.
데이터 바인딩 글을 보시면 string으로 입력한 색상이 Background에도 적용하는 것을 볼 수 있습니다.

이는 WPF의 형 변환 메커니즘이 동작해서 문자열이 Brush 객체로 변환되는 현상입니다. 개발자는 IValueConverter 인터페이스를 상속하여 필요한 변환기를 만들 수 있습니다.

IValueConverter

IValueConverter 인터페이스를 상속받은 클래스를 생성하게 되면 아래와 같이 Convert와 ConvertBack 두 함수를 작성해야합니다. 만약 bool 타입을 string으로 변환하는 변환기를 만든다고하면 아래와 같이 만들 수 있습니다.

public class BoolToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool bValue)
        {
            if (bValue)
                return "true";
            else
                return "false";
        }
        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string strValue && string.IsNullOrEmpty(strValue) is not true)
        {
            if (string.Equals(strValue, "true", StringComparison.OrdinalIgnoreCase) is true)
                return true;
            else if (string.Equals(strValue, "false", StringComparison.OrdinalIgnoreCase) is true)
                return false;
            else
                return Binding.DoNothing;
        }
        return Binding.DoNothing;
    }

    }
}

Convert는 표준 함수이고, ConvertBack은 양방향 데이터 바인딩에서만 사용됩니다. 이 BoolToStringConverter 클래스를 xaml에서 인스턴스화 하여 바인딩 식에서 사용해 줍니다.

<Window x:Class="WpfConverter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:WpfConverter"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        mc:Ignorable="d">
    <Window.Resources>
        <local:BoolToStringConverter x:Key="BoolToStringConverter"/>
    </Window.Resources>

    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>

    <StackPanel Orientation="Vertical">
        <CheckBox IsChecked="{Binding Checked}"
                  Height="20"/>
        <TextBox Text="{Binding Checked, Converter={StaticResource BoolToStringConverter}, UpdateSourceTrigger=PropertyChanged}"
                 Height="20"/>
    </StackPanel>
</Window>

재물 파일은 아래와 같이 체크박스와 텍스트박스가 표시됩니다.

그 다음 ViewModel에서는 CheckBox에 바인딩 되는 bool 타입의 속성만 만들어주면 됩니다.

public class MainWindowViewModel : Notifier
{
    private bool _checked = false;
    public bool Checked { get => _checked; set => OnPropertyChanged(ref _checked, value); }
    public MainWindowViewModel()
    {
    }
}

실행

실행해 보면 아래와 같이 동작합니다. CheckBox는 bool Checked 속성을 바인딩하여 표시하고, TextBox에서도 bool Checked속성을 바인딩 하지만 BoolToStringConverter를 통해 변환된 string을 표시하게 됩니다. TextBox에 입력된 문자열은 변환기의 ConvertBack 함수를 통해 bool 타입으로 변환됩니다.


github: https://github.com/3001ssw/c_sharp/tree/main/WPF/WPF_Basic/WpfConverter