C#/C# WPF 개념
[C# WPF] 바인딩 #02 - 컨버터
냠냠쿠
2023. 8. 17. 14:19
728x90
1. 컨버터
- 소스 객체와 바인딩 객체의 데이터 형태가 다를 때, 데이터를 일치시키기 위한 기술
- CS에서 컨버터 클래스를 만들어서 XAML상 불러와 사용
ex) CheckBox에서 체크 되었을 때 특정 대상을 화면에서 사라지게 하고 싶은 경우,
CheckBox의 IsCheked 속성은 T/F로 넘어오는데, 화면에서 사라지게 하는 Visibility 속성은 Visible이나 Hidden으로 표시되어야 한다.
만약 Opacity를 이용하는 경우 0 또는 1의 값이 되어야 한다.
이렇게 형태가 다를 때 일치시켜주는 것이 컨버터의 역할
◾ 컨버터 만들기
(1) 컨버터 클래스를 만들어준다.
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
// 컨버터 클래스 생성
public class BoolTovisibilityConverter
{
}
}
(2) IValueConverter 클래스 상속을 받는다.
...
// 컨버터 클래스 생성 후 IvalueConverter 상속
public class BoolTovisibilityConverter : IValueConverter
{
}
...
(3) 자동생성 기능을 통해 메서드 추가
...
// 컨버터 클래스 생성 후 IvalueConverter 상속
public class BoolTovisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
}
→ IValueConverter 내 함수 중 Convert 메서드 : 소스 객체로부터 value를 받아 바인딩 할 객체에 필요한 형태로 변경 해주는 메서드
예) bool 형태의 value를 받아 Visibility 형태로 변경해주는 컨버터
public class BoolTovisibilityConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool val = (bool)value;
if (val)
return Visibility.Visible;
else
return Visibility.Hidden;
}
→ ConvertBack 메서드 : Convert와 반대. 바인딩할 객체의 속성이 변경될 때 소스 객체의 속성 또한 변경시켜주는 경우 사용. 바인딩 모드가 Two-Way일 때만 동작
...
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility val = (Visibility)value;
if (val == Visibility.Hidden)
return false;
else
return true;
}
#endregion
}
}
◾ 컨버터 사용하기
🔸 CS파일에서 다른 namespace를 사용하는 법
(1) using 구문 사용
(2) xmlns:local = namespace 선택
→ CS파일에서는 자기 자신의 namespace를 등록할 필요가 없지만 XAML에서는 기본적으로 자기 사진이 등록되어 있지 않기 때문에 목록에서 현재 namespace를 등록해줘야한다.
🔸 XAML파일에서 리소스 추가하는 법
- 모든 컨트롤에는 개별적으로 리소스를 개별 컨트롤 하위에 <컨트롤:Resource></컨트롤.Resource>의 방식으로 리소스를 등록 할 수 있다.
→ 주로 색상, 컨트롤 스타일, 이미지 정보 등이 됨 - 컨버터의 경우에도 사용하고자 하는 위치에 리소스로 등록을 해 줘야한다.
사용하고자 하는 속성에서 {StaticResource 키이름},{DynamicResource 키이름}
StaticResource 키이름: 프로그램 실행 시 결정되어 변경되지 않는 리소스. DynamicResource보다는 StaticResource를 사용하는 것을 권고
DynamicResource 키이름 : 프로그램 실행 중에도 변경이 가능한 리소스 - XAML 에디터에서 리소스를 읽어오지 못해 디자인이 표시되지 않는 경우 StaticResource를 DynamicResource로 변경해주면 표시 될 때가 있다.
(1) 리소스 태그 등록 및 리소스 등록
<Window x:Class="WpfApp1.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:WpfApp1"
mc:Ignorable="d"
Title="Window"
SizeToContent="WidthAndHeight" ShowInTaskbar="True"
WindowStyle="ThreeDBorderWindow" ResizeMode="NoResize" Background="#FFDDDDDD" d:DesignWidth="258"
>
//윈도우에 등록된 리소스는 전체에서 이용 가능
//stackPanel 밑에StackPanel.Resouce 와 같은 형태로 추가해도 무방
//단, 리소스 등록이 되면 등록된 컨트롤 하위에서만 이용이 가능하고 상위에서는 이용할 수 없다.
<!-- 리소스태그 : 리소스를 등록할 장소를 만든다 -->
<Window.Resources>
<!-- 리소스 등록 -->
<!-- 컨버터를 리소스로 등록해야하기 때문에, 컨버터가 포함된 네임스페이스의 이름, 앞서 정의한 local을 먼저 불러온다.-->
<!-- local : 입력시 사용 가능한 클래스 목록이 뜬다. -->
<local:BoolToVisibilityConverter/>
</Window.Resources>
</Window>
(2) key 등록
...
<Window.Resources>
<local:BoolToVisibilityConverter x:Key="boolToVisibilityConverter"/>
</Window.Resources>
...
(3) 컨버터 리소스 추가 후 바인딩 되는 장소의 구문에서 컨버터 적용
...
<Window.Resources>
<local:BoolToVisibilityConverter x:Key="boolToVisibilityConverter"/>
</Window.Resources>
<StackPanel Height="200" Width="200">
<CheckBox Name="chbx" Content="Activate" Margin="5"/>
<TextBox Name="txtb" Text="Test" Margin="5" Visibility="{Binding ElementName=chbx, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}"/>
</StackPanel>
...
728x90