BindConversion
Converter는 원본과 대상이 서로 다른 데이터 형식을 갖고 있거나 일부 변환이 필요한 경우 원본과 대상 사이의 다리 역할을 합니다. 바인딩 시 데이터를 변환 하려면 Convert 및 ConvertBack 메서드를 포함하는 IValueConverter 인터페이스를 구현 해야 합니다.
이 예제는 날짜 타입 데이터가 바인딩 속성 타입에 따라 Brushes 또는 날짜 시간 문자열로 변환하는 역할을 하는 Converter를 구현 합니다.
- DateTime 속성을 가진 클래스를 정의 합니다.
1: public class MyData : INotifyPropertyChanged
2: {
3: private DateTime _thedate;
4: public DateTime TheDate
5: {
6: get { return _thedate; }
7: set { _thedate = value; }
8: }
9: public MyData()
10: {
11: _thedate = DateTime.Now;
12: }
13: public event PropertyChangedEventHandler PropertyChanged;
14: protected void OnPropertyChanged(string propertyName)
15: {
16: PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
17: }
18: }
- IValueConverter 인터페이스를 구현 합니다.
1: public class MyConverter : IValueConverter
2: {
3: public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
4: {
5: var date = (DateTime)value;
6: switch (targetType.Name)
7: {
8: case "String":
9: return date.ToString("F", culture);
10: case "Brush":
11: return Brushes.Red;
12: default:
13: return value;
14: }
15: }
16: public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
17: {
18: throw new NotImplementedException();
19: }
20: }
Convert 메서드는 value 변수를 통해 원본 데이터를 참조 하여 Object 형식의 데이터를 반환 하도록 구현 하며, ConvertBack 메소는 TwoWay 바인딩일 경우 구현 하도록 합니다.
1: <local:MyData x:Key="MyDataSource" />
2: <local:MyConverter x:Key="MyConvertReference" />
- StackPanel의 DataContext로 MyDataSource를 사용합니다. 이로써 StackPanel 하위 트리에 있는 엘레먼트는 MyDataSource의 속성 값을 공유 받을 수 있습니다.
1: <StackPanel.DataContext>
2: <Binding Source="{StaticResource MyDataSource}" />
3: </StackPanel.DataContext>
- 하나의 TextBlock은 날짜 문자열을 바인딩 하고 다른 하나의 TextBlock은 Converter를 이용해 Foreground속성은 Brushes로, Text 속성은 날짜,시간 문자열로 변환 합니다.
1: <TextBlock Text="Unconverted data:" />
2: <TextBlock Text="{Binding Path=TheDate}" />
3: <TextBlock Text="Converted data:"/>
4: <TextBlock Name="myConvertedtext"
5: Foreground="{Binding Path=TheDate, Converter={StaticResource MyConvertReference}}">
6: <TextBlock.Text>
7: <Binding Path="TheDate"
8: Converter="{StaticResource MyConvertReference}" />
9: </TextBlock.Text>
10: </TextBlock>
댓글
댓글 쓰기