TOC

This article is currently in the process of being translated into Korean (~93% done).

데이터 바인딩:

IValueConverter를 이용한 값 전환

지금까지는 데이터 바인딩을 하는 대상끼리 호환되는 속성을 사용했습니다. 하지만 호환되지 않는 데이터를 바인딩 시켜야 할 경우가 생길 것입니다. 한 가지 유형의 값을 다른 방식으로 표현하는 경우를 살펴보겠습니다.

값 변환은 언제 사용하는가.

값 변환기는 데이터 바인딩을 할 때 자주 사용될 것입니다. 간단한 예는 다음과 같습니다.

  • 0을 한가지의 방법으로 표현하고, 양수를 특정한 방법으로 표시하려고 합니다.
  • 체크박스를 값으로 확인하려는데 값이 Boolean 값이 아니라 "yes", "no" 처럼 문자열 형식인 경우입니다.
  • 파일 크가는 바이트 단위이지만 파일의 크기에 따라 바이트, 킬로바이트, 메가바이트, 기가바이트 단위로 나누어 표시하려고 합니다.

위의 경우는 간단한 경우이지만, 실제로 다양한 사례들을 만날 수 있습니다. 예를 들어 CheckBox의 값이 false 일때에는 체크가 되어있고 true 일떄는 체크가 되지않은 상황처럼 반대의 상황을 구현해야 할 때도 있습니다. 또한 변환기를 사용해 값에 따라 true일 경우 초록색 false인 경우는 빨간색의 이미지를 만들어 ImageSource로 사용할 수 있습니다. 이처럼 가능성은 무한합니다!

이처럼 값 변환기를 유용하게 사용할 수 있습니다. IValueConverter 인터페이스를 사용하는 이 클래스는 마치 번역가처럼 소스와 바인딩 대상 사이에서 값을 변환시켜줍니다. 즉, 값을 대상에 적용하거나 소스에 대입할 때 변환이 필요한 경우 변환기가 필요할 것입니다.

간단한 값 변환

앞서 언급했듯이 WPF 값 변환기는 IValueConverter 인터페이스 또는 IMultiValueConverter 인터페이스 (나중에 자세히 설명)를 구현해야합니다. 두 인터페이스 모두 Convert () 및 ConvertBack ()의 두 가지 메서드를 구현하면됩니다. 이름에서 알 수 있듯이 이러한 메서드는 값을 대상 형식으로 변환 한 다음 다시 되 돌리는 데 사용됩니다.

문자열을 입력받은 다음 Boolean 값을 반환하는 간단한 변환기를 구현해 보겠습니다. 당신이 WPF를 처음 사용하고 이 자습서를 읽으면서 아래의 예제에 사용 된 개념을 모두 알지 못할 수도 있습니다. 하지만 걱정하지 마십시오. 코드 리스트 다음에 모두 설명됩니다.

<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
        Title="ConverterSample" Height="140" Width="250">
	<Window.Resources>
		<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
	</Window.Resources>
	<StackPanel Margin="10">
		<TextBox Name="txtValue" />
		<WrapPanel Margin="0,10">
			<TextBlock Text="Current value is: " />
			<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
		</WrapPanel>
		<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
	</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;

namespace WpfTutorialSamples.DataBinding
{
	public partial class ConverterSample : Window
	{
		public ConverterSample()
		{
			InitializeComponent();
		}
	}

	public class YesNoToBooleanConverter : IValueConverter
	{
		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			switch(value.ToString().ToLower())
			{
				case "yes":
				case "oui":
					return true;
				case "no":
				case "non":
					return false;
			}
			return false;
		}

		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			if(value is bool)
			{
				if((bool)value == true)
					return "yes";
				else
					return "no";
			}
			return "no";
		}
	}
}

Code-behind

이제 예제 뒤쪽에서 부터 시작하여 살펴 보겠습니다. YesNoToBooleanConverter라는 코드 숨김 파일에 변환기를 구현했습니다. 앞에서 말한대로 Convert() 및 ConvertBack() 이라는 두 가지 필수 메서드 만 구현합니다. Convert() 메서드는 문자열을 입력( 매개 변수)으로 받은 다음 대체 값이 false 인 Boolean 타입인 true 또는 false 값으로 변환한다고 가정합니다. 재미를 위해 프랑스어 단어에서도 이 변환을 수행 할 수있는 가능성을 추가했습니다.

ConvertBack() 메서드는 명백하게 Convert()와 반대로 작동합니다. Boolean 타입의 입력 값을 가정 한 다음 "no"의 대체 값과 함께 영어 단어 "yes"또는 "no"를 반환합니다.

해당 두가지 메서드에 추가적인 파라미터에 대해서 궁금할 수 있으나 현재 예제에서는 필요치 않음으로 해당 내용은 다음 챕터에서 설명하겠습니다.

XAML

프로그램의 XAML 부분에서는 변환기의 인스턴스를 창에 대한 리소스로 선언하는 것으로 시작합니다. 그런 다음 TextBox, 몇 개의 TextBlocks 및 CheckBox 컨트롤이 있으며 여기에서 흥미로운 일이 발생합니다. TextBox의 값을 TextBlock 및 CheckBox 컨트롤에 바인딩하고 Converter 속성과 자체 변환기 참조를 사용하여 필요한 것에 따라 문자열과 부울 값 사이에서 값을 앞뒤로 저글링합니다.

이 예제를 실행하려고하면 두 위치에서 값을 변경할 수 있습니다. TextBox에 "yes"(또는 false를 원하는 경우 다른 값)를 작성하거나 CheckBox를 확인합니다. 무엇을하든 변경 사항은 다른 컨트롤과 TextBlock에 반영됩니다.

Summary

이것은 간단한 값 변환기의 예제였으며 설명을 위해 필요한 것보다 약간 더 길었습니다. 다음 장에서는 더 고급 예제를 살펴 보겠지만 나아가서 자신의 변환기를 작성하기 전에 WPF에 이미 변환기가 포함되어 있는지 확인할 수 있습니다. 글을 쓰는 시점에서 활용할 수 있는 20 개 이상의 내장 변환기가 있지만 그 이름을 알아야합니다. 당신에게 도움이 될 다음 목록을 찾았습니다. http://stackoverflow.com/questions/505397/built-in-wpf-ivalueconverters


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!