MultiBinding
이 예제는 여러 값을 바인딩 하는 방법과 바인딩 된 여러 값을 변환 처리 하는 방법에 대해 설명 합니다. 아래 이미지는 ListBox의 아이템을 선택 시 Normal Format, LastNameFirst Format 항목의 값이 동시에 변환 되는도록 구성되어 있습니다.
사용자 정의 객체 정의
먼저, 바인딩에 필요한 FistName, LastName 속성을 포함하는 PersonName 객체와 이름 저장할 수 있는 NameList 컬렉션 객체를 정의 합니다.
1: public class PersonName
2: {
3: public PersonName(string first, string last)
4: {
5: FirstName = first;
6: LastName = last;
7: }
8: public string FirstName { get; set; }
9: public string LastName { get; set; }
10: }
1: public class NameList : ObservableCollection<PersonName>
2: {
3: public NameList()
4: {
5: Add(new PersonName("Willa", "Cather"));
6: Add(new PersonName("Isak", "Dinesen"));
7: Add(new PersonName("Victor", "Hugo"));
8: Add(new PersonName("Jules", "Verne"));
9: }
10: }
IMultiValueConvert 구현
MultiBinding을 통해 여러 값이 바인딩 되었을 경우 여러 값 변환이 필요할 경우 사용한다. 이번 예제에서는 FirstName과 LastName을 하나의 이름으로 조합하며, Parameter에 따라 순서를 변경하여 조합하도록 구현 합니다.
1: public class NameConverter : IMultiValueConverter
2: {
3: public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
4: {
5: string name;
6: switch ((string)parameter)
7: {
8: case "FormatLastFirst":
9: name = values[1] + ", " + values[0];
10: break;
11: default:
12: name = values[0] + " " + values[1];
13: break;
14: }
15: return name;
16: }
17: public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
18: {
19: var splitValues = ((string)value).Split(' ');
20: return splitValues;
21: }
22: }
LocalResources 및 DataTemplate선언
데이터 소스로 사용할 NameList Collection과 멀티 바인딩 값 변환을 하는 NameConverter를 선언 합니다. 그리고 ListBoxItem의 데이터 표시 템플릿을 정의 합니다.
1: <Window.Resources>
2: <local:NameList x:Key="NameListData" />
3: <local:NameConverter x:Key="MyNameConverter" />
4: <DataTemplate x:Key="NameItemTemplate">
5: <TextBlock>
6: <TextBlock.Text>
7: <MultiBinding Converter="{StaticResource MyNameConverter}">
8: <Binding Path="FirstName" />
9: <Binding Path="LastName" />
10: </MultiBinding>
11: </TextBlock.Text>
12: </TextBlock>
13: </DataTemplate>
14: </Window.Resources>
MultiBinding
MultiBinding을 부모 엘리먼트로 가지는 Bind 엘리먼트로 여러 속성을 바인딩 해야 합니다. 위 코드는 FirstName, LastName을 바인딩 하고, 두 값을 MyNameConverter를 이용해 하나의 값으로 변환하여 TextBlock.Text 속성에 설정하고 있습니다.
ListBox
ItemSource를 로컬 리소스로 선언 한 NameListData로 참조하고, ItemTemplate를 NameItemTemplate를 참조 합니다.
1: <ListBox Width="200"
2: ItemsSource="{StaticResource NameListData}"
3: ItemTemplate="{StaticResource NameItemTemplate}"
4: IsSynchronizedWithCurrentItem="True" />
IsSynchronizedWithCurrentItem
동일한 데이터 소스를 방인딩 하였을 경우 아이템 선택이 변경 되었을 경우 선택된 항목과 동기화 여부를 설정하는 속성 입니다. (기본값: Null)
TextBlock Binding
MultiBinding을 통해 두 속성을 바인딩하며, MultiValueConverter를 통해 ConvertParameter에 따라 변환된 값을 표시 합니다.
1: <TextBlock Padding="0,20,0,0" FontSize="11" Background="White">Normal Format:</TextBlock>
2: <TextBlock Name="textBox1" DataContext="{StaticResource NameListData}">
3: <TextBlock.Text>
4: <MultiBinding Converter="{StaticResource MyNameConverter}"
5: ConverterParameter="FormatNormal">
6: <Binding Path="FirstName" />
7: <Binding Path="LastName" />
8: </MultiBinding>
9: </TextBlock.Text>
10: </TextBlock>
11: <TextBlock Padding="0,20,0,0" FontSize="11" Background="White">Last Name First Format:</TextBlock>
12: <TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
13: <TextBlock.Text>
14: <MultiBinding Converter="{StaticResource MyNameConverter}"
15: ConverterParameter="FormatLastFirst">
16: <Binding Path="FirstName" />
17: <Binding Path="LastName" />
18: </MultiBinding>
19: </TextBlock.Text>
20: </TextBlock>
XAML 전체 소스
1: <Window x:Class="MultiBinding.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:MultiBinding"
7: mc:Ignorable="d"
8: Title="MainWindow" Height="350" Width="525">
9: <Window.Resources>
10: <local:NameList x:Key="NameListData" />
11: <local:NameConverter x:Key="MyNameConverter" />
12: <DataTemplate x:Key="NameItemTemplate">
13: <TextBlock>
14: <TextBlock.Text>
15: <MultiBinding Converter="{StaticResource MyNameConverter}">
16: <Binding Path="FirstName" />
17: <Binding Path="LastName" />
18: </MultiBinding>
19: </TextBlock.Text>
20: </TextBlock>
21: </DataTemplate>
22: </Window.Resources>
23: <StackPanel>
24: <TextBlock FontSize="18" FontWeight="Bold" Margin="10" Background="White" Width="Auto">MultiBinding Sample</TextBlock>
25: <ListBox Width="200"
26: ItemsSource="{StaticResource NameListData}"
27: ItemTemplate="{StaticResource NameItemTemplate}"
28: IsSynchronizedWithCurrentItem="True" />
29: <TextBlock Padding="0,20,0,0" FontSize="11" Background="White">Normal Format:</TextBlock>
30: <TextBlock Name="textBox1" DataContext="{StaticResource NameListData}">
31: <TextBlock.Text>
32: <MultiBinding Converter="{StaticResource MyNameConverter}"
33: ConverterParameter="FormatNormal">
34: <Binding Path="FirstName" />
35: <Binding Path="LastName" />
36: </MultiBinding>
37: </TextBlock.Text>
38: </TextBlock>
39: <TextBlock Padding="0,20,0,0" FontSize="11" Background="White">Last Name First Format:</TextBlock>
40: <TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
41: <TextBlock.Text>
42: <MultiBinding Converter="{StaticResource MyNameConverter}"
43: ConverterParameter="FormatLastFirst">
44: <Binding Path="FirstName" />
45: <Binding Path="LastName" />
46: </MultiBinding>
47: </TextBlock.Text>
48: </TextBlock>
49: </StackPanel>
50: </Window>
댓글
댓글 쓰기