티스토리 뷰
2022.09.06 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내v1.0 part9-2 StyleSelector
2022.08.31 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part9-1 DataTemplateSelector
2022.08.08 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part8-3 Template
2022.08.02 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part8-2 Template
2022.07.21 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part8-1 Template
2022.07.13 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part7 Behavior
2022.07.05 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part6 Command
2022.06.27 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part5 Converter
2022.06.15 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part4-2 Data Binding
2022.06.13 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part4-1 Data Binding
2022.06.07 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part3-3
2022.06.02 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part3-2
2022.05.30 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part3-1
2022.05.11 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part2
2022.05.09 - [WPF .NET] - MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part1
1. IValueConverter
- 바인딩에 사용될 사용자 지정 논리를 만드는 방법을 제공합니다.
- 기본 특징
- 하나의 데이터에 대해서만 처리 합니다.
- IValueConverter 인터페이스를 구현하는 클래스를 만든 다음 Convert와 ConvertBack 메서드에 사용자 지정 논리를 추가합니다..
- Convert는 바인딩 원본에서 바인딩 대상으로 데이터를 출력용으로 변환하는데 사용됩니다.
- ConvertBack은 바인딩 대상에서 바인딩 원본으로 데이터를 입력용으로 변환하는데 사용되지만, TwoWay 바인딩이 아니면 구현하지 않습니다.
- 일반적으로 StaticResource에 객체로 등록하고 사용합니다.
- 이 경우 생성자 Dependency Injection을 사용할 수 없습니다.
- ConverterParameter를 이용해서 다양한 방식으로 사용이 가능합니다.
- 바인딩이 불가능하기 때문에 XAML에서 표현 가능한 데이터만 전달할 수 있습니다.
2. IMultiValueConverter
- 기본 특징
- 여러 데이터를 이용해서 하나의 데이터를 반환합니다.
- IMultiValueConverter 인터페이스를 구현하는 클래스를 만든 다음 Convert와 ConvertBack 메서드에 사용자 지정 논리를 추가합니다.
- 일반적인 특징은 IValueConverter와 동일합니다.
- 바인딩을 위해서는 <MultiBinding/> 사용해야 합니다.
- WPF에서만 사용 가능합니다.
3. Converter 객체화 방법 및 사용법
StaticResource
XAML를 이용해서 StaticResource로 생성할 수 있습니다.
<Window.Resources>
<local:BoolToStringConverter x:Key="BoolToStringConverter" />
</Window.Resources>
XAML에서 사용
<DataGridTextColumn Binding="{Binding Sex, Converter={StaticResource BoolToStringConverter}}" Header="성별" />
Code에서 사용
- 바인딩을 Code로 하는 경우 사용하거나, Converter의 기능을 코드로 이용하기 위해서 사용할 수 있습니다.
- 특별한 경우가 아니면 Code에서 컨버터를 사용하는 것은 추천하지 않습니다.
Dependency Injection을 이용해야 하는 경우
우선 StaticResource에 등록을 한 후 디자인 타임에서 개발하고, 런타임에서 컨버터의 객체를 생성해서 App.Current.Resources에 집어 넣어 줍니다.
물론 이 경우 동일한 컨버터가 2개가 생성됩니다. ^^;;;
만약 한개만 생성되도록 하려면 <d:ResourceDictionary> ... </d:ResourceDictionary> 등을 이용해야 합니다.
var converter = App.Current.Services.GetService(typeof(BoolToVisibilityConverter));
App.Current.Resources["BoolToVisibilityConveter"] = converter;
4. 기본 컨버터 예제 - InvertedBoolenConverter
- Bool 값이 true이면 false를, false이면 true를 반환하는 컨버터
- IsEnabled와 IsReadOnly를 모두 사용해야하는 경우 활용합니다.
- return Binding.DoNothing; WPF에서만 사용 가능하며, 아무것도 하지 않는다는 의미입니다.
public class InvertedBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool b)
return !b;
//WPF에서만 사용 가능합니다.
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<StackPanel Grid.Column="1" Margin="5">
<CheckBox Content="Test InvertedBooleanConverter"
IsChecked="{Binding IsEdit, Mode=TwoWay}" />
<TextBlock Text="IsEnabled Binding" />
<TextBox IsEnabled="{Binding IsEdit}" />
<TextBlock Text="IsReadOnly Binding" />
<TextBox IsReadOnly="{Binding IsEdit,
Converter={StaticResource InvertedBooleanConverter}}" />
</StackPanel>
5. 프로퍼티를 활용하는 컨버터 예제 - BoolToVisibilityConverter
- Bool 값이 true이면 TrueVisibility를 반환하고, false이면 FalseVisibility를 반환하는 컨버터
- true일 때와 false 일때 반대되는 동작을 하는 컨버터를 1개의 컨버터로 구현합니다.
/// <summary>
/// Bool To Visibility
/// </summary>
public class BoolToVisibilityConverter : IValueConverter
{
/// <summary>
/// true일때 값
/// </summary>
public Visibility TrueVisibility { get; set; } = Visibility.Visible;
/// <summary>
/// false일때 값
/// </summary>
public Visibility FalseVisibility { get; set; } = Visibility.Collapsed;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool boolValue)
{
return boolValue ? TrueVisibility : FalseVisibility;
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
생성 예제
<local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<local:BoolToVisibilityConverter
x:Key="BoolToVisibilityReverseConverter"
FalseVisibility="Visible"
TrueVisibility="Collapsed" />
사용 예제
<TextBlock Text="IsEdit is true"
Visibility="{Binding IsEdit, Converter={StaticResource BoolToVisibilityConverter}}" />
<TextBlock Text="IsEdit is false"
Visibility="{Binding IsEdit, Converter={StaticResource BoolToVisibilityReverseConverter}}" />
6. ConverterParameter 사용 예제 - StringCompareParameterToBoolConverter
- String 값을 ComverterParameter로 전달되는 값에 포함되면 TrueValue를 아니면 FalseValue를 반환합니다.
- ConverterParameter에 전달되는 값은 문자열1|문자열2|문자열3... 형식을 가져야 합니다.
public class StringCompareParameterToBoolConverter : IValueConverter
{
/// <summary>
/// true일때 값
/// </summary>
public bool TrueValue { get; set; } = true;
/// <summary>
/// false일때 값
/// </summary>
public bool FalseValue { get; set; } = false;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool returnValue = FalseValue;
string data = value?.ToString() ?? "";
if (parameter is not string para)
{
return returnValue;
}
string[] split = para.Split('|');
returnValue = split.Contains(data) ? TrueValue : FalseValue;
return returnValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
생성 예제
<local:StringCompareParameterToBoolConverter x:Key="StringCompareParameterToBoolConverter" />
사용 예제
<TextBlock Text="Test StringCompareParameterToBoolConverter" />
<TextBox x:Name="Fruit" />
<CheckBox IsChecked="{Binding ElementName=Fruit, Path=Text, Converter={StaticResource StringCompareParameterToBoolConverter}, ConverterParameter=apple|banana|strawberry}" />
7. 의존성 주입 예제, IMultiValueConverter 예제
의존성 주입하는 Converter 예제와 IMultiValueConverter 예제는 다수의 요청이 있으면, 그 때 추가하도록 하겠습니다.
8. 실행 결과
8. 소스
WpfTest/ConverterSample at master · kaki104/WpfTest (github.com)
'WPF .NET' 카테고리의 다른 글
MVVM Pattern을 사용하는 개발자를 위한 안내 v1.0 part7 Behavior (3) | 2022.07.13 |
---|---|
MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part6 Command (0) | 2022.07.05 |
MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part4-2 Data Binding (0) | 2022.06.15 |
MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part4-1 Data Binding (0) | 2022.06.13 |
MVVM Pattern을 사용하는 개발자를 위한 안내 V1.0 part3-3 (2) | 2022.06.07 |
- Total
- Today
- Yesterday
- Always Encrypted
- windows 11
- C#
- ComboBox
- Visual Studio 2022
- ef core
- uno platform
- #MVVM
- WPF
- dotNETconf
- visual studio 2019
- .net 5.0
- MVVM
- PRISM
- Bot Framework
- Behavior
- UWP
- LINQ
- #prism
- .net
- kiosk
- Microsoft
- IOT
- uno-platform
- Windows 10
- XAML
- #uwp
- Cross-platform
- Build 2016
- #Windows Template Studio
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |