[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

MSDN WPF 샘플 따라하기 - MultiBinding

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>  







댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행