18장. WPF IValueConverter를 이용한 데이터바인딩, DataType이 다른 경우의 Data Binding

18장. WPF IValueConverter를 이용한 데이터바인딩, DataType이 다른 경우의 Data Binding

참조

목적

  • WPF IValueConverter 를 이용하여 데이터바인딩을 해봅니다.

IValueConverter 를 이용한 데이터바인딩

  • 데이터바인딩시 소스와 타겟의 데이터 타입이 다른 경우가 있는데, 예를 들면 체크박스의 체크여부에 다라 "예", "아니오" 등을 표시하는 경우 들이 있습니다.
  • 데이터바인딩시 타입의 변경을 위해서 IValueConverter를 사용하며 IValueConverter 인터페이스를 구현하는 클래스가 소스와 타겟 사이의 값을 변환 합니다.
  • WPF Value Converter는 IValueConverter 인터페이스 또는 IMultiValueConverter 인터페이스를 구현해야 하며 Convert() 및 ConvertBack()의 두 가지 메서드만 구현하면 됩니다.
  • 문자열을 입력으로 불리언(Bollean) 값을 반환하는 간단한 변환기를 구현해 보겠습니다.

실습

MainWindow.xaml

<Window x:Class="WPF16_Test.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF16_Test"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="400">
    <Window.Resources>
        <local:YesNoToBoolConverter x:Key="converter"/>
    </Window.Resources>

    <StackPanel>
        <TextBox x:Name="textBox"
                 Text="YES"/>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Current Value : "/>
            <TextBlock x:Name="tb_Check" 
                       Text="{Binding ElementName=textBox,
                                      Path=Text,
                                      Converter={StaticResource converter}}"/>
        </StackPanel>

        <CheckBox Content="{Binding Path=Text, ElementName=textBox}"
                  IsChecked="{Binding Path=Text, ElementName=textBox,
                                      Converter={StaticResource converter}}"/>
    </StackPanel>
</Window>

YesNoToBoolConverter.cs

using System;
using System.Globalization;
using System.Windows.Data;

namespace WPF16_Test
{
    public class YesNoToBoolConverter : IValueConverter
    {
        /// <summary>
        /// 소스값이 타겟에 바인딩 되는 경우 호출
        /// TextBox -> TextBlock, TextBox -> CheckBox
        /// TextBox의 Text 속성이 값 "YES", "NO" 에 따라 true, false, 를 리턴
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            switch (value.ToString().ToUpper())
            {
                case "YES": return true;
                case "NO": return false;
            }
            return false;
        }

        /// <summary>
        /// 타겟값이 역으로 소스에 바인딩 될 때 호출
        /// CheckBox -> TextBox
        /// CheckBox의 값 true, false 에 따라 "YES", "NO" 문자열을 리턴
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool)
            {
                if ((bool)value == true)
                    return "YES";
                else
                    return "NO";
            }

            return "NO";
        }
    }
}

실행 결과

1

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY