티스토리 뷰

반응형

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)

 

GitHub - kaki104/WpfTest

Contribute to kaki104/WpfTest development by creating an account on GitHub.

github.com

 

반응형
댓글