WPF 에서 MarkupExtension 을 활용한 Converter 만들기
WPF 에서 MarkupExtension 을 활용한 Converter 만들기
WPF 에서는
IValueConverter
를 사용할 때 매번 리소스로 등록하고 StaticResource 또는 DynamicResource 로 참조하는 방식이 번거롭게 느껴질 수 있습니다.
이럴 때MarkupExtension
을 상속받아 간편하게 XAML에서 직접 사용할 수 있는 Converter를 만들 수 있습니다.
기존 방식의 단점
1
2
3
4
5
<Window.Resources>
<local:BooleanToVisibilityConverter x:Key="BoolToVis"/>
</Window.Resources>
<TextBlock Visibility="{Binding IsVisible, Converter={StaticResource BoolToVis}}" />
하지만 리소스 등록이 반복되면 지저분해지고 유지보수가 어렵습니다.
MarkupExtension을 활용한 Converter 만들기
```MarkupExtension 을 상속하면 이렇게 사용할 수 있습니다:
``cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
### 예제 코드
```cs
public class BoolToVisConverter : MarkupExtension, IValueConverter
{
private static BoolToVisConverter? _instance;
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _instance ??= new BoolToVisConverter();
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value is bool b && b ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return this;
}
}
이제 별도 리소스 등록 없이 XAML 에서 직접 사용 가능:
1
<TextBlock Visibility="{Binding IsVisible, Converter={local:BoolToVisConverter}}" />
장점 요약
- 매번 리소스 등록할 필요 없음
- 코드 재사용성 높음 (static 인스턴스)
- 가독성 향상
마무리
WPF 에서는 XAML 이 길어지기 쉬운데, MarkupExtension
기반의 Converter 는 이를 깔끔하게 정리하는 좋은 방법입니다. 자주 사용하는 Converter라면 꼭 이 방법을 고려해보세요.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.