WPF 시리즈 포스팅을 진행하고 있습니다. 아래 링크를 클릭하시면 연관된 다른 포스트들을 보실 수 있습니다.
목록
- MVVM 패턴으로 WPF 시작하기 - 01 프로젝트 만들기
- MVVM 패턴으로 WPF 시작하기 - 02 UI 구성 (Grid, ListView, StackPanel)
- MVVM 패턴으로 WPF 시작하기 - 03 ViewModel 구성
- MVVM 패턴으로 WPF 시작하기 - 04 TextBox와 ComboBox
안녕하세요 데브봉입니다.
이번 포스트는 Converter에 대해서 알아보도록 하겠습니다.
- Converter란?
단어의 뜻 그대로, 어떤 데이터를 View에 보여질 때만 변경 시켜서 보이지게 하는 것 입니다. 예를 들어 true, false의 값을 View 화면에서는 "남자", "여자"로 보여지게만 되고 값은 true, false 그대로 남아 있는거죠.
Converter는 IValueConverter라는 인터페이스를 상속해야 xaml에서 바인딩 시, Converter를 사용할 수 있습니다.
그럼 한번 만들어 보도록 하겠습니다.
1. Converter 만들기
먼저 관리에 용이할 수 있도록 Converters라는 폴더를 최상위에 만들어 주고 BoolToGender.cs 라는 파일을 안에 생성합니다.

그 다음, 접근제한자를 public으로 바꿔주고 IValueConverter 인터페이스를 상속하면 오류 나오는데, 인터페이스를 구현하도록 해주지 않아서 그렇습니다. 오류를 없애주기 위해선 메소드 Overloading을 해줍니다.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace MyFirstWPFApp.Converters
{
public class BoolToGender : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Convert 메소드는 ViewModel에서 View로 갈때 사용되고
ConvertBack은 반대로 View에서 ViewModel로 갈 때 사용됩니다.
true, false값을 "남자", "여자"로 변환하는 것이므로 Convert 메소드를 아래와 같이 코딩합니다.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not bool boolean)
return DependencyProperty.UnsetValue;
return boolean ? "남자" : "여자";
}
DependencyProperty.UnsetValue는 바인딩 시, 값이 잘못된 값일 때 반환값 설정이 되어있다면, 설정된 값으로 반환시키는 역할을 합니다. 예로 들면 잘못된 값일 때 false로 지정해 놓고 DependencyProperty.UnsetValue으로 반환하면, false로 값이 나타나게 되는 것이죠.
(참고로 TargetNullValue가 Null일때 설정하는 속성, FallbackValue이 잘못된 값일 때 설정하는 속성입니다.)
그럼 이로써 Convert 객체를 완성하였습니다.
2. Converter 연동
컨버터를 만들었으니 연동을 시켜야겠죠? MainWindow.xaml로 돌아가서 먼저 Window Resource에 컨버터를 등록 시킵니다.
<Window
x:Class="MyFirstWPFApp.Views.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:MyFirstWPFApp.Views"
xmlns:c="clr-namespace:MyFirstWPFApp.Converters"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Window.Resources>
<c:BoolToGender x:Key="BoolToGender" />
</Window.Resources>
...
...
...
</StackPanel>
</Window>
주의 할 것은 반드시, 해당 컨버터가 있는 폴더를 네임스페이스로 등록 시켜줘야 합니다.
xmlns:c="clr-namespace:MyFirstWPFApp.Converters"
그리고 변환이 필요한 곳에 Converter를 연동시켜줍니다.
<ComboBox
...
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource BoolToGender}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
...
...
<StackPanel Grid.Row="1" Orientation="Horizontal">
...
<TextBlock Margin="5" Text="{Binding SelectedPerson.Gender, Converter={StaticResource BoolToGender}}" />
</StackPanel>
연동이 완료되었습니다.
3. 프로그램 실행
한번 프로그램을 실행 해 보도록 하겠습니다.

보시는 바와 같이 true값을 "남자", false값을 "여자"로 변환되었습니다. 콤보박스와 선택된 직원의 정보를 보는 아래 StackPanel에서도 똑같이 적용되는 것을 보실 수 있습니다.
이번 포스트는 Converter에 관해 간단히 알아보았습니다.
관련 코드는 아래 깃허브에서 다운받으실 수 있습니다.
https://github.com/epqmqhd/BasicWPF_05
감사합니다!

'if ( Programming ) > WPF' 카테고리의 다른 글
[WPF] 캡처 방지 기능을 만들어 보자 - SetWindowDisplayAffinity (2) | 2023.07.18 |
---|---|
[WPF] Mutex를 사용하여 중복 실행을 막아보자! (0) | 2023.01.31 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 04 Textbox와 ComboBox (2) | 2023.01.25 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 03 ViewModel 구성 (0) | 2023.01.25 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 02 UI 구성 (Grid, ListView, StackPanel) (0) | 2023.01.24 |