WPF, XAML

C#, WPF IValueConverer를 이용한 데이터바인딩

 

C#, WPF IValueConverter를 이용한 데이터바인딩

 

www.topcredu.co.kr  이종철(mylife68@nate.com)

 

n  데이터바인딩시 소스와 타겟의 데이터타입이 다른 경우가 있다. 예를 들면 체크박스의 체크여부에 따라 ”, “아니오등을 표시하는 경우 또는 파일 크기가 바이트이지만 파일의 크기에 따라 바이트, 킬로바이트, 메가 바이트 또는 기가 바이트로 표시하려고 하는 경우가 그렇다.

n  데이터바인딩시 타입의 변경을 위해 IValueConverter가 존재하며 IValueConverter 인터페이스를 구현하는 클래스가 소스와 대상 사이의 값을 변환한다.

n  WPF 값 변환기는 IValueConverter 인터페이스 또는 IMultiValueConverter 인터페이스 를 구현해야 하며 두 인터페이스 모두 Convert() ConvertBack() ​​두 가지 메서드 만 구현하면 된다.

n  문자열을 입력으로 불리언(Boolean) 값을 반환하는 간단한 변환기를 구현해 보자.

n  [실행화면]

n 

 

 

n  [YesNoToBoolConverter.cs]

 

using System;

using System.Windows.Data;

 

namespace ConverterTest

{

    class YesNoToBoolConverter : IValueConverter

    {

        public object Convert(object value, Type tergetType, object param, System.Globalization.CultureInfo culture)

        {

            switch(value.ToString())

            {

                case "Yes": return true;

                case "No": return false;

            }

            return false;

        }

 

        public object ConvertBack(object value, Type tergetType, object param, System.Globalization.CultureInfo culture)

        {

            if (value is bool)

            {

                if ((bool)value == true) return "Yes";

                else return "No";              

            }

            return "No";

        }

    }

}

 

n  [MainWindow.xaml]

 

<Window x:Class="ConverterTest.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:ConverterTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>

        <local:YesNoToBoolConverter x:Key="converter"/>

    </Window.Resources>

    <StackPanel>

        <TextBox Name="txtValue"/>

        <WrapPanel>

            <TextBlock Text="Current Value : "/>

            <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource converter}}"/>

        </WrapPanel>

        <CheckBox Content="Yes" IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource converter}}" />

    </StackPanel>

</Window>

 

 


 

Comments