본문 바로가기

SW 개발 공부/C#

[C#] IValueConveter 패턴

 

XAML에서 데이터 바인딩 된 값을 UI에 맞게 가공하는 방법은 IValueConverter를 사용하는 것이다.

 

xaml 파일 내에서 바인딩 된 값이 UI에 적용되기 전에 가공될 수 있도록 해주는 중간 처리자 역할을 한다.

 

IValueConverter 인터페이스다. 

따라서 사용자가 추가로 정의 할 수 있도록 되어있고 구조는 아래와 같다.

 

public interface IValueConverter
{
    object Convert(object value, Type targetType, object parameter, CultureInfo culture);
    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
}

 

두 메서드는 데이터 바인딩 중 값의 변환 방향 (데이터 소스 <-> UI) 을 기준으로 선언되어있다.

 

Convert 메서드는 "데이터 소스 -> UI" 로 값이 전달될때 호출된다.

ConvertBack 메서드는 "데이터 소스 <- UI" 로 값이 전달될때 호출된다. 대부분의 단방향 바인딩에서는 사용되지 않아 
throw new NotImplemetedException()으로 남겨도 충분하다.

 

 

따라서 해당 인터페이스를 사용하여 커스텀 컨버터 클래스를 선언하면 된다.

public class MessageToBrushConverter : IValueConverter

 

 

예시는 아래와 같다.

  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
      var message = value as string;

      if(message == null)
          return null;
      
      if(message.Contains("Emergency"))
          return eAlarmType.Emergency;
      return null;
  }

 

<DataTrigger Binding="{Binding Message, Converter={StaticResource ContainsWarningConverter}}" Value="1">
    <Setter Property="Background" Value="Red"/>
</DataTrigger>

 

 

주의사항

 

커스텀 Value converter 클래스는 반드시 적용하려는 xaml 클래스의 외부 또는 중첩 클래스가 아닌 별도 클래스로 선언해야 xaml에서 인식이 가능하다.

 

추가로 xaml 파일에서 적용시킬때, namespace가 동일해야 정상적으로 동작이 가능하다.

 

이유는 xaml은 public으로 선언된 클래스만 접근 가능하다.

'SW 개발 공부 > C#' 카테고리의 다른 글

[C#/기초 문법] 구조체, 클래스  (1) 2025.02.06
[C#/기초 문법] namespace  (0) 2025.02.06
[C#] delegate 활용(Callback과 Event)  (0) 2025.01.31
[C#] delegate  (0) 2025.01.31
[C#] 배열을 Sort 하는 방법 OrderBy  (0) 2025.01.17